在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函数不起作用。
请告诉我,我该怎么做?
答案 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;
}
}
}