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

qmlオブジェクトのプロパティをc++から変更する正しい方法は、そのオブジェクトを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");

これを次のように1行の呼び出しに圧縮できます。

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 に答える