2

在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 函数不起作用。

你能告诉我我该怎么做吗?

4

1 回答 1

4

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

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

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

请注意,您必须添加用于获取子对象的对象名称属性。在此示例中,矩形是根对象。然后在 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;
      }
  }
}
于 2012-11-02T07:29:30.980 回答