c++ - 主要行为中的 qmlRegisterType 行为怪异
问题描述
我在 C++ 中实现了一个模型并想分配给 Qml,但错误消息显示:
无法将函数分配给除 var 以外的任何类型的属性。
我的代码可能有什么问题,谢谢!
.qml
ListView{
anchors.fill: parent
model:MyModel{
list:data
}
delegate: objRecursiveDelegate
}
主文件
qmlRegisterType<MyModel>("Model",1,0,"MyModel");
qmlRegisterUncreatableType<Data>("Model",1,0,"Data",QStringLiteral("Data should not be created in QML"));
Data data;
engine.rootContext()->setContextProperty(QStringLiteral("data"), &data);
MyModel.h(尝试使用 QAbstractListModel 定义)
class Data;
class MyModel : public QAbstractListModel
{
Q_OBJECT
Q_PROPERTY(Data *list READ list WRITE setList)
public:
Data *list() const;
void setList(Data *list);
private:
Data* mList;
}
我的模型.cpp
Data *MyModel::list() const
{
return mList;
}
void MyModel::setList(Data *list)
{
beginResetModel();
if (mList)
mList->disconnect(this);
mList = list;
/..../
endResetModel();
}
数据.h
class Data:public QObject
{
Q_OBJECT
public:
explicit Data(QObject *parent = nullptr);
/..../
private:
QVector<unit> menu;
};
解决方案
错误很简单,data()
QAbstractListModel的方法,所以如果你使用里面的数据MyModel
就是解释你要使用这个方法而不是你真正要传递的数据,解决办法就是改名:
*.cpp
Data data;
engine.rootContext()->setContextProperty(QStringLiteral("info"), &data);
*.qml
ListView{
anchors.fill: parent
model:MyModel{
list: info
}
delegate: objRecursiveDelegate
}
加:
另一方面,您还有另一个错误,Data items 方法必须返回菜单:
QVector<unit> Data::items() const{ return menu; }
另一方面,在您的委托中,您必须使用名称访问每个角色,如果模型:
Component { id: objRecursiveDelegate Column { Row { //indent Item { height: 1 width: level * 40 // <-- } Text { text: name // <-- } Button{ x:550 width:30 text: "-" } } } }
我对您的代码进行了其他改进,因此您可以在以下链接中找到完整的代码。
推荐阅读
- javascript - 无法单击带有 HtmlUnit 的 RadioButton
- javascript - AMP 中是否有 popState 来支持浏览器历史堆栈?
- javascript - 如果 Input 元素没有值,如何禁用 LinkButton?
- android - 如何在 Android 应用中部署自定义图像处理算法?
- c# - C#GetDeclaredProperty Set Value 错误,方法 SetValue 没有重载有一个参数
- excel - 我们如何将 value + 5 添加到整个列
- gcc - 将 C 函数与“奇数”地址对齐
- unity3d - 随机中的随机?
- node.js - Heroku 错误模块未找到 'json-server'
- javascript - 使 Angular Material 选项卡拖放重新排序选项卡索引