【问题标题】:How to invoke method of QML object from C++如何从 C++ 调用 QML 对象的方法
【发布时间】:2015-01-26 16:49:26
【问题描述】:

我有以下 QML 代码:

Rectangle {
id: mainRect
...
    Rectangle{
    id: listRect
    ...
       ListModel {
          id: idModel
          ... some stuff added
       }
    }
}

我想清除 idModel,使用 ListModel 的clear 方法。 像这样的东西(在 QML 内部)完美运行:

 idModel.clear()

但我想在 C++ 中实现相同的目标。 尝试以下:

  QQuickView view;
  view.setSource(QUrl("qrc:/main.qml"));
  QQuickItem* item = view.rootObject();
  QObject* model = item->findChild<QObject*>("mainRect")->findChild<QObject*>("listRect")->findChild<QObject*>("idModel");
  QMetaObject::invokeMethod(model,"clear");

也尝试搜索模型为

 QObject* model = item->findChild<QObject*>("idModel");
 QObject* model = item->findChild<QObject*>("listRect")->findChild<QObject*>("idModel");

但是上面的这些东西不起作用......我什至无法理解 - 如果 C++ 中的 findChild 方法没有找到任何东西,或者 InvokeMethod 不起作用。

谁能给我解释一下? 使用 QT5.4\QtQuick 2.4

【问题讨论】:

    标签: c++ qt qml


    【解决方案1】:

    要使用findChild(),您应该将objectName 设置为您的qml 项目。

    Rectangle {
    id: mainRect
    ...
        Rectangle{
        id: listRect
        ...
           ListModel {
              id: idModel
              objectName: "idModel"
              ... some stuff added
           }
        }
    }
    

    然后,您可以获得指向您的 ListModel 的指针

    QObject* model = item->findChild<QObject*>("idModel");
    

    要调用方法,你应该使用QMetaObject::invokeMethod()

    QMetaObject::invokeMethod(model,"clear");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-14
      • 2018-01-06
      • 1970-01-01
      • 2020-06-24
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      相关资源
      最近更新 更多