Qt QML:无法将[未定义]分配给

Qt QML:无法将[未定义]分配给,qt,qml,Qt,Qml,我正在尝试将QtAndroid程序的接口从QWidgets重写为QML。我以前从未使用过它,所以错误可能非常明显和愚蠢 新界面基于ListView: 它看起来像: ListView { id: listView x: 16 y: 146 width: 262 height: 282 model: myModel delegate: Item { x: 5 width: 80 heigh

我正在尝试将QtAndroid程序的接口从QWidgets重写为QML。我以前从未使用过它,所以错误可能非常明显和愚蠢

新界面基于ListView:

它看起来像:

ListView
{
    id: listView
    x: 16
    y: 146
    width: 262
    height: 282
    model: myModel
    delegate: Item
    {
        x: 5
        width: 80
        height: 40
        Row
        {
            id: row1
            spacing: 10
            Text
            {
                width: 50
                text:model.modelData.getPassword
                font.bold: true
                anchors.verticalCenter: parent.verticalCenter
            }
            ProgressBar
            {
                value: model.modelData.getDifficulty
            }
        }
    }
}
main()中的列表是这样填写的:

QList<QObject*> dataList;
dataList.append(new DataObject("Item 1", 50));
dataList.append(new DataObject("Item 2", 60));
dataList.append(new DataObject("Item 3", 70));
dataList.append(new DataObject("Item 4", 80));


QGuiApplication app(argc, argv);
qmlRegisterType<BackEnd>("tk.asciigames.backend", 1, 0, "BackEnd");

QQmlApplicationEngine engine;

engine.rootContext()->setContextProperty("myModel", QVariant::fromValue(dataList));

engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

return app.exec();
运行QML时,确实显示了4行(如预期的那样),但没有数据。 日志中有以下错误:

qrc:/main.qml:118:26: Unable to assign [undefined] to QString
qrc:/main.qml:124:28: Unable to assign [undefined] to double
这些错误对应于QML行:

text:model.modelData.getPassword
value: model.modelData.getDifficulty
因此,看起来QML获取了数组,但无法从中获取数据


有人能帮我找到一个错误吗?

当您声明Q_属性时,您定义了一个名称和一个getter函数。GETER函数被C++用来获取属性的实际值,但QML引擎对此一无所知;它只知道属性名(本例中为密码)

因此,在QML文件中,更改行

text:model.modelData.getPassword
value: model.modelData.getDifficulty

你应该可以走了

请注意,还可以使用缩短的语法来访问属性

value: model.modelData.difficulty // OK
value: model.difficulty // OK
value: modelData.difficulty // OK
value: difficulty // Still OK
value: model.model.model.model.model.modelData.difficulty // OK, but don't do that
您可能还希望将Q_属性标记为常量,以消除警告
QQmlExpression:Expression qrc:/main。qml:25:20取决于不可通知的属性:

Q_PROPERTY(QString password READ getPassword CONSTANT)

所以我的问题真的是“非常明显和愚蠢”。现在可以了。谢谢。
value:model.model.model.model.model.modelData.demobility//OK,但不要这样做
=>太完美了!
text:model.modelData.password
value: model.modelData.difficulty
value: model.modelData.difficulty // OK
value: model.difficulty // OK
value: modelData.difficulty // OK
value: difficulty // Still OK
value: model.model.model.model.model.modelData.difficulty // OK, but don't do that
Q_PROPERTY(QString password READ getPassword CONSTANT)