如何从C ++调用QML对象的方法

时间:2015-01-26 08:33:05

标签: c++ qt qml

我有以下QML代码:

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

我想使用ListModel的clear方法清除idModel。 像这样的东西(在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

1 个答案:

答案 0 :(得分:3)

要使用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");