QAbstractListModel可能是一个解决方案,但我认为这对我来说有点过分了……不确定
我正在C ++中制作一个可从QML内部访问的向量:
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(QVector<QString> items READ items WRITE setItems NOTIFY itemsChanged)
// ...
}
经过测试,我可以从QML中访问矢量:
console.log("myClass.items >>> ", myClass.items) // Logs vector of strings
在我的QML UI上,我打算显示向量内的字符串列表。我尝试使用ListModel
和ListView
,但我不知道该怎么做。有人可以帮忙吗?
ListModel {
id: myListModel
// How to compose my model here according to vector of strings
// i.e. myClass.items
}
ListView {
model: myListModel
delegate: {
// ... show the strings inside the vector
}
}
按照@Amfasis和@mohabouje的建议,我像这样修改了我的代码,但是由于某些原因它不工作。
C ++方面:
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(QStringList items READ items WRITE setItems NOTIFY itemsChanged)
//...
}
QML方面:
Row {
ListView {
id: items
model: myClass.items // Directly connect to C++ string list
delegate: Text {
text: modelData // Strings are NOT displayed on QML UI
// Log of modelData shows it is empty
}
}
}
在QML上,我登录myClass.items
,然后看到我的字符串列表:
console.log("myClass.items >>> ", myClass.items)
// logs:
// qml: myClass.items >>> [item 0,item 1,item 2]
设置或修改项目时,我需要emit
修改信号,否则将无法正常工作:
m_items = /* set items here */;
emit itemsChanged(m_items); // This is required!
答案 0 :(得分:2)
您应该向QML引擎公开您的类接口。在这种情况下,您可以将QVector<QString>
替换为QStringList
。
class MyModel: public QObject {
Q_OBJECT
Q_PROPERTY(QStringList model READ model NOTIFY modelChanged)
...
};
如果您查看docs:
没有命名角色的模型(例如下面显示的ListModel)将具有通过modelData角色提供的数据。还为只有一个角色的模型提供了modelData角色。在这种情况下,modelData角色包含与命名角色相同的数据。
因此,您应该使用属性modelData
:
ListView {
model: mymodel.model
delegate: Text {
text: modelData
}
}
要公开您的C ++类,请查看此page。