Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt QML通过字符串访问QObject_C++_Qt_Qml - Fatal编程技术网

C++ Qt QML通过字符串访问QObject

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

我有一个暴露于qml上下文属性的模型,它包含一个列表列表。这些列表是动态创建的,然后也暴露在qml上下文中

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()