2

大丈夫。私はたくさん検索しましたが、まだ良い解決策がありません。私は初めてQtです。QQuickItem私はそのようなクラスを持っています、

class MyQuickItemClass : public QQuickItem
{
    Q_OBJECT
    SetInfo(SomeCppClass object)
};

このように横に登録するのqmlRegisterTypeを自分でやるのですが、main.cppqml

qmlRegisterType< MyQuickItemClass >("MyQ​​uickItemClass", 1, 0, "MyQuickItemClass");

ここまでは大丈夫。しかし->オブジェクトインスタンスといくつかのプロパティを MyQuickItemClass に設定し、その中にいくつかのC++ロジックも設定してから、MyQuickItemClassオブジェクトをに渡しますqml。または、MyQuickItemClassQml から有効なインスタンスを取得します。C++ 側から vlid インスタンス オブジェクト インスタンスを取得するにはどうすればよいですか?MyQuickItemClassQMLmain.cpp

ここのリンクから次の学習を行ってみました。しかし、この手法では の 2 つの別個のオブジェクトが作成されますMyQuickItemClass。からQML1 つ、c++側面から 1 つ。したがって、私にはうまくいきません。

以下は、多くの検索の後にこれを実行しようとしている方法です。

int main(int argc, char *argv[]) 
{
  qmlRegisterType< MyQuickItemClass >("MyQuickItemClass", 1, 0, "MyQuickItemClass");
  QQmlApplicationEngine engine;
  SomeCppClass someCppClassObject;
  someCppClassObject.updateSomething();

  MyQuickItemClass myquickItemObject;
  myquickItemObject.SetInfo(someCppClassObject);
  engine.rootContext()->setContextProperty("myquickItemObject", &myquickItemObject);

  engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
  return app.exec();
}

しかし、上記を実行すると、コンストラクターがMyQuickItemClass2 回呼び出されます。cppオブジェクトを作成したときに横から 1 回、横から 1回qml。のコンストラクターにもブレークポイントを配置して、これを確認しましたMyQuickItemClass。その結果、プログラムの実行時にsomeCppClassObject設定したものは内部で null になります。MyQuickItemClassqml がインスタンス化するための最後の呼び出しを行ったため、で作成したオブジェクトはMyQuickItemClass無視されます。MyQuickItemClassmain.cpp

これが私のqmlコードですMyQuickItemClass

import QtQuick 2.5
import MyQuickItemClass 1.0

ParentContainerItem {
  id: parentItem
  color: "black"

  MyQuickItemClass {
      id: myQuickItemID
      visible: true
      objectName: "myQuickItem"

      property bool someProperty1: false
      property bool someProperty2: true

      anchors.top: parent.top
      anchors.horizontalCenter: parent.horizontalCenter
  }

  //Other qml components
}

これは、オブジェクトを に設定する必要がある C++ クラスですMyQuickItemClass

SomeCppClass {
  //Pure C++ class. No Qt
}

MyQuickItemClassから派生したままにしておく必要があることに注意してくださいQQuickItem。提案してください...

4

2 に答える 2

0

ここでの議論の提案から次のことを行うと、問題が解決し、有効なオブジェクトが QuickItem qml ファイルに取得されます

QQuickItem *myItem = engine.rootObjects()[0]->findChild<QQuickItem *>("myQuickItem");
于 2016-10-23T17:45:36.507 に答える