qt - 从字符串向量创建 ListView/ListModel
问题描述
序幕
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!
解决方案
您应该向 QML 引擎公开您的类接口。在这种情况下,您可以将 your 替换QVector<QString>
为QStringList
.
class MyModel: public QObject {
Q_OBJECT
Q_PROPERTY(QStringList model READ model NOTIFY modelChanged)
...
};
如果您查看文档:
没有命名角色的模型(例如下面显示的 ListModel)将具有通过 modelData 角色提供的数据。还为只有一个角色的模型提供了 modelData 角色。在这种情况下,modelData 角色包含与命名角色相同的数据。
因此,您应该使用该属性modelData
:
ListView {
model: mymodel.model
delegate: Text {
text: modelData
}
}
要公开您的 C++ 类,请查看此页面。
推荐阅读
- javascript - 在页面加载触发预取后是否附加 rel = prefetch 或 prerender 的链接?
- c++ - 我可以编写一个库,以便在加载时首先生成一个以后可以被其他函数访问的数据集吗?
- csv - 是否有雪花命令重新格式化时间戳以确保它们正确显示在 CSV 导出中
- c# - 剃刀页面:如何在呈现网页之前等待页面模型加载信息
- c# - 如何在 NX 上使用 C# 编写的代码?(如何将 C# 代码编译成 NX?)
- python - 从数据类的 __str__ 表示中排除某些属性
- r - 替换#DIV/0!R中为0的值
- python - 步长为 0.1 的循环,但尝试将结果存储到矩阵时出现索引错误
- azure-active-directory - 根据主要用户域的 AAD 动态设备组
- android - Android Studio 中的颤振插件在哪里?