大丈夫。私はたくさん検索しましたが、まだ良い解決策がありません。私は初めてQt
です。QQuickItem
私はそのようなクラスを持っています、
class MyQuickItemClass : public QQuickItem
{
Q_OBJECT
SetInfo(SomeCppClass object)
};
このように横に登録するのqmlRegisterType
を自分でやるのですが、main.cpp
qml
qmlRegisterType< MyQuickItemClass >("MyQuickItemClass", 1, 0, "MyQuickItemClass");
ここまでは大丈夫。しかし->オブジェクトインスタンスといくつかのプロパティを MyQuickItemClass に設定し、その中にいくつかのC++ロジックも設定してから、MyQuickItemClass
オブジェクトをに渡しますqml
。または、MyQuickItemClass
Qml から有効なインスタンスを取得します。C++ 側から vlid インスタンス オブジェクト インスタンスを取得するにはどうすればよいですか?MyQuickItemClass
QML
main.cpp
ここのリンクから次の学習を行ってみました。しかし、この手法では の 2 つの別個のオブジェクトが作成されますMyQuickItemClass
。からQML
1 つ、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();
}
しかし、上記を実行すると、コンストラクターがMyQuickItemClass
2 回呼び出されます。cpp
オブジェクトを作成したときに横から 1 回、横から 1回qml
。のコンストラクターにもブレークポイントを配置して、これを確認しましたMyQuickItemClass
。その結果、プログラムの実行時にsomeCppClassObject
設定したものは内部で null になります。MyQuickItemClass
qml がインスタンス化するための最後の呼び出しを行ったため、で作成したオブジェクトはMyQuickItemClass
無視されます。MyQuickItemClass
main.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
。提案してください...