主要的 qmlRegisterType 表现得很奇怪
qmlRegisterType in main behave wierd
我用c++实现了一个模型,想赋值给Qml,但是报错信息显示:
Unable to assign a function to a property of any type other than var.
我的代码可能有什么问题,谢谢!
.qml
ListView{
anchors.fill: parent
model:MyModel{
list:data
}
delegate: objRecursiveDelegate
}
main.cpp
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(try to define using 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;
}
MyModel.cpp
Data *MyModel::list() const
{
return mList;
}
void MyModel::setList(Data *list)
{
beginResetModel();
if (mList)
mList->disconnect(this);
mList = list;
/..../
endResetModel();
}
data.h
class Data:public QObject
{
Q_OBJECT
public:
explicit Data(QObject *parent = nullptr);
/..../
private:
QVector<unit> menu;
};
错误很简单,QAbstractListModel的data()
方法,所以如果你在MyModel
里面使用数据,它解释你想使用这个方法而不是你真正想要的数据要通过,解决方法是改名字:
*.cpp
Data data;
engine.rootContext()->setContextProperty(QStringLiteral("info"), &data);
*.qml
ListView{
anchors.fill: parent
model:MyModel{
list: info
}
delegate: objRecursiveDelegate
}
加上:
另一方面你有另一个错误,数据项方法必须return菜单:
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: "-"
}
}
}
}
我对您的代码进行了其他改进,因此您可以在下面找到完整的代码 link。
我用c++实现了一个模型,想赋值给Qml,但是报错信息显示:
Unable to assign a function to a property of any type other than var.
我的代码可能有什么问题,谢谢!
.qml
ListView{
anchors.fill: parent
model:MyModel{
list:data
}
delegate: objRecursiveDelegate
}
main.cpp
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(try to define using 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;
}
MyModel.cpp
Data *MyModel::list() const
{
return mList;
}
void MyModel::setList(Data *list)
{
beginResetModel();
if (mList)
mList->disconnect(this);
mList = list;
/..../
endResetModel();
}
data.h
class Data:public QObject
{
Q_OBJECT
public:
explicit Data(QObject *parent = nullptr);
/..../
private:
QVector<unit> menu;
};
错误很简单,QAbstractListModel的data()
方法,所以如果你在MyModel
里面使用数据,它解释你想使用这个方法而不是你真正想要的数据要通过,解决方法是改名字:
*.cpp
Data data;
engine.rootContext()->setContextProperty(QStringLiteral("info"), &data);
*.qml
ListView{
anchors.fill: parent
model:MyModel{
list: info
}
delegate: objRecursiveDelegate
}
加上:
另一方面你有另一个错误,数据项方法必须return菜单:
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: "-" } } } }
我对您的代码进行了其他改进,因此您可以在下面找到完整的代码 link。