我用Qt / QtQuick 非常新的。
我使用Qt Designer设计了a simple form,它由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
子类text: foo
替换我的虚拟模型时,我必须将text: model.display.foo
替换为delegate
in { delegate: Item {
// ...
Row {
id: row1
Text {
text: model.display.foo // <=== See?
// ...
}
}
}
:
FooListModel* flm= new FooListModel();
QQmlContext *ctxt = engine.rootContext();
ctxt->setContextProperty("FooModel", flm);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
如果我不这样做,Qt会抱怨
qrc:/MainForm.ui.qml:23:ReferenceError:未定义foo
并且没有显示任何内容。
我设置了这样的模型属性,an actual C++ model:
text
为什么会这样?
另外 - 假设“这是一个功能而不是错误” - 必须更改schoolid/chilidid
属性意味着我不能再在QtDesigner中拥有我的虚拟数据或使用内联模型进行原型设计; 我能以任何方式避免这种情况吗?
请找到有问题的MWE in my main.cpp
。
答案 0 :(得分:2)
qrc:/MainForm.ui.qml:23: ReferenceError: foo is not defined
表示您必须在foo
中定义FooListModel
个角色。例如,
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
角色。
另外 - 假设&#34;它是一个功能,而不是一个错误&#34;
是的,text: model.display.foo
正常,因为display
是QAbstractItemModel
中的预定义角色。