我是Qt/QtQuick的新手。
我有一个用Qt设计器设计的简单表单,它由一个ListView
唯一组成。
Item {
// ...
ListView {
id: listView1
anchors.fill: parent
model: FooModel
delegate: Item {
// ...
Row {
id: row1
Text {
text: foo
// ...
}
}
}
}
}
这可以很好地与以下内容配合使用——或者将其复制粘贴为model
,或者让qmlscene
或Qt Designer注意到dummydata
:中包含的FooModel.qml
ListModel {
ListElement {
foo: "1"
}
ListElement {
foo: "2"
}
ListElement {
foo: "3"
}
ListElement {
foo: "4"
}
}
但是,当我试图用QAbstractListModel
的子类的实际C++模型替换我的伪模型时,我必须在delegate
:中用text: model.display.foo
替换text: foo
delegate: Item {
// ...
Row {
id: row1
Text {
text: model.display.foo // <=== See?
// ...
}
}
}
如果我不这样做,Qt抱怨
qrc:/MainForm.ui.qml:23:ReferenceError:foo未定义
并且什么也不显示。
我在main.cpp
:中这样设置模型属性
FooListModel* flm= new FooListModel();
QQmlContext *ctxt = engine.rootContext();
ctxt->setContextProperty("FooModel", flm);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
为什么
此外,假设"这是一个功能,而不是一个bug",必须更改text
属性意味着我不能再在QtDesigner中拥有我的伪数据,也不能使用内联模型进行原型设计我能以任何方式避免这种情况吗
请在Github上找到有问题的MWE
qrc:/MainForm.ui.qml:23: ReferenceError: foo is not defined
意味着您必须在FooListModel
中定义foo
角色。例如,
class FooListModel : public QAbstractListModel
{
public:
enum FooListModelRoles
{
FooRole = Qt::UserRole + 1,
BarRole,
//...
}
QHash<int, QByteArray> roleNames() const //override
{
QHash<int, QByteArray> roleName;
roleName[FooRole] = "foo"; //define "foo" role for QML
roleName[BarRole] = "bar"; //define "bar" role for QML
return roleName;
}
//...
}
QML中的代表现在可以访问foo
角色。
此外,假设"这是一个功能,而不是一个错误">
是的,text: model.display.foo
工作正常,因为display
是QAbstractItemModel
中预定义的角色。