C++ Qt QML通过字符串访问QObject
我有一个暴露于qml上下文属性的模型,它包含一个列表列表。这些列表是动态创建的,然后也暴露在qml上下文中C++ Qt QML通过字符串访问QObject,c++,qt,qml,C++,Qt,Qml,我有一个暴露于qml上下文属性的模型,它包含一个列表列表。这些列表是动态创建的,然后也暴露在qml上下文中 Model: #include <QtCore> #include <QQmlContext> class Model : public QObject { Q_OBJECT public: Model(QQmlContext* rootContext) { rootContext->setContextProperty(QML_N
Model:
#include <QtCore>
#include <QQmlContext>
class Model : public QObject
{
Q_OBJECT
public:
Model(QQmlContext* rootContext) {
rootContext->setContextProperty(QML_NAME, this);
dataLists.push_back( new DatedValueList(rootContext, "List1", "m"));
names.push_back("List1");
}
QList<DatedValueList*> dataLists;
QString QML_NAME = "Model";
QList<QString> names;
Q_INVOKABLE QList<QString> getListNames() { return names };
};
第二条输出线不工作。它是一个字符串,我想调用它的函数。但是我如何转换它或将字符串用作qml上下文id?作为最低要求,您必须实现一个函数,在您的
模型类上返回DatedValueList
:
Q_INVOKABLE DatedValueList getList(const QString& name) { return ... };
但这立即带来了一个小挑战,因为您的数据结构不允许查找,因此应该迭代整个数据列表
成员
我认为您最好从模型
类中提供QVariantMap
,您可以为每个列表指定一个名称,也可以获取列表本身:
//C++
Q_PROPERTY(QVariantMap listMap ...)
//QML
model.listMap.keys()[0]
model.listMap[model.listMap.keys()[0]].getUnit()
但这甚至可能是一个错误的决定,这取决于您想要如何塑造其余的UI,我最确定的是,它不会是console.log
's only;-)
另请注意,上下文属性的第一个字母不应大写。您可能正在控制台内实例化一个模型
。log
调用,而不是引用main中实例化的模型
请提供一个我修改过的实例,但问题远没有概述:/
import QtQuick 2.15
import QtQuick.Window 2.15
Window {
id: mainview
width: 1800
height: 768
visible: true
flags: Qt.Window
Timer {
interval: 1000 // 1 Hz
running: true
repeat: true
onTriggered: {
console.log( Model.getListNames()[0] ) // Output: List1
console.log( Model.getListNames()[0].getUnit() ) // Not working
}
}
}
Q_INVOKABLE DatedValueList getList(const QString& name) { return ... };
//C++
Q_PROPERTY(QVariantMap listMap ...)
//QML
model.listMap.keys()[0]
model.listMap[model.listMap.keys()[0]].getUnit()