来自c ++的qml元素id访问

时间:2012-11-02 00:13:22

标签: javascript c++ methods qml

在c ++方面我编写了这段代码

    :::::::::::::
    QMetaObject::invokeMethod(rootObject,"changeText",Q_ARG(QVariant,"txt1"),
Q_ARG(QVariant,"hello"))

在qml方面我写了这个

Text {
  id: txt1
  text: "hi"
}

function changeText(id,str){
        id.text=str
}

changeText函数在qml端工作,但是当我从c ++端调用它时它不起作用。我认为Cpp方法将“txt1”作为QString发送,因此changeText函数不起作用。

请告诉我,我该怎么做?

1 个答案:

答案 0 :(得分:4)

从c ++更改qml对象属性的正确方法是在c ++中获取该对象,而不是调用 setProperty()方法。例: QML:

Rectangle
{
  id: container
  width: 500; height: 400

  Text {
    id: txt1
    objectName: "text1"
    text: "hi"
  }
}

请注意,您必须添加用于获取子项的对象名称属性。在此示例中,Rectangle是rootObject。然后在c ++:

QObject *rootObject = dynamic_cast<QObject*>(viewer.rootObject());
QObject *your_obj = rootObject->findChild<QObject*>("text1");
your_obj->setProperty("text", "500");

您可以将此压缩为一行调用,如下所示:

viewer.rootObject()->findChild<QObject*>("text1")->setProperty("text", "You text");

另一种方法是使用您之前使用的方法,但是将对象名称赋予 changeText 方法并迭代主对象的子对象,直到找到您感兴趣的对象:

Rectangle {
  id: container
  width: 500; height: 400

  Text {
    id: txt1
    objectName: "text1"
    text: "hi"
  }

  function changeText(objectName,str){
    for (var i = 0; i < container.children.length; ++i)
      if(container.children[i].objectName === objectName)
      {
        container.children[i].text = str;
      }
  }
}