簡體   English   中英

從C ++訪問QML元素ID

[英]qml element id access from c++

在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端方法將Qtxt發送“ txt1”作為QString,因此changeText函數不起作用。

你能告訴我我該怎么做嗎?

從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;
      }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM