Auf C++ Object in QML zugreifen
-
Hi,
ich versuche auf ein C++-Objekt über QML zuzugreifen, in dem ich es demQQmlApplicationEngine
als Context Property übergebe:main.cpp
ChessModel chessModel; QQmlApplicationEngine engine; engine.rootContext()->setContextProperty(QStringLiteral("_chessModel"), &chessModel);
Dann versuche ich es über QML zuzugreifen:
main.qml
_chessModel.onInvalidMove: invalidLabel.visible = true _chessModel.onValidMove: { invalidLabel.visible = false; console.log("valid move ", col, row); }
Allerdings bekomme ich einen Laufzeitfehler:
QQmlApplicationEngine failed to load component
qrc:/main.qml:134:5: Cannot assign to non-existent property "_chessModel"
Das sollte eigentlich Straight Forward sein. Hat jemand eine Idee, weshalb das nicht klappt?
Mein Code ist auf GitGub verfügbar.
Danke im Voraus!
-
Ich glaub zwar nicht, dass man das hier braucht:
qRegisterMetaType<ChessModel>();
Aber hilft es vielleicht, wenn du das vor das setContextProperty ziehst?
Was ist mit den ganzen anderen Zugriffen auf _chessProperty, funktionieren die, oder versucht er noch nicht, die auszuwerten?
-
@Mechanics sagte in Auf C++ Object in QML zugreifen:
Ich glaub zwar nicht, dass man das hier braucht:
qRegisterMetaType<ChessModel>();
Das hatte ich auch schon versucht, aber dasselbe Problem. Das ist nur dann relevant, wenn man einen Datentyp über eine QueuedConnection über Signal/Slots übertragen möchte.
Was ist mit den ganzen anderen Zugriffen auf _chessProperty, funktionieren die, oder versucht er noch nicht, die auszuwerten?
Die Zugriffe funktionieren nicht.
Ich habe nun eine neue Version hochgeladen. Ich habe die Signal-Slots-Connections nun explizit in QML deklariert. Nun bekomme ich aber den Fehler:ReferenceError: squareSize is not defined
ReferenceError: ChessModel is not defined
Zum Hintergrund: Das soll einfach nur eine Portierung von einem Qt Quick Ultralite Schach-Beispiel zu "normalem" QML sein, weil ich gerne ein Schach-Spiel schreiben würde. Aber irgendwie scheint das schwieriger zu sein als gedacht...
-
Ich bin mit QML auch nie wirklich warm geworden.
Das heißt ja auch _chessModel, sehe nicht, dass du an der Stelle mit ChessModel was anderes meinen könntest.
-
@Mechanics sagte in Auf C++ Object in QML zugreifen:
Ich bin mit QML auch nie wirklich warm geworden.
Das heißt ja auch _chessModel, sehe nicht, dass du an der Stelle mit ChessModel was anderes meinen könntest.
Oh, da hatte ich eine Variable nicht vollständig umbenannt...
Jetzt beschwert er sich, dass squareSize nicht definiert ist, obwohl das direkt in QML definiert ist...ReferenceError: squareSize is not defined
-
Das ist ja auch in einem anderen Element.
Ich denke, man kann dem Element mit dem Property zumindest eine id geben, und dann über id.squareSize darauf zugreifen. Aber ob das jetzt die beste Lösung in QML ist, weiß ich nicht. Mir fällt zumindest keine andere ein.
-
Seltsam, die Properties sind nur über das Root-Element und nicht über das Eltern-Element zugreifbar....
Nun wird das Brett zumindest gerendert, aber das Bewegen der Figuren funktioniert noch nicht, aber heute ist erst mal Pause angesagt....
Ich muss sagen, dass ich Qt Widgets leichter in Erinnerung habe. Ebenfalls Java Swing...Ich bin ernsthaft am Überlegen auf etwas anderes umzusteigen. Flutter oder einfach HTML 5 und dann mit C++ Code interagieren...
Danke jedenfalls für deine Hilfe!
-
Ich hab schon alle möglichen Frameworks ausprobiert, und ich hatte noch nie so viele Probleme, wie mit Qml. Und ich habs aufgegeben (mehr oder weniger, ab und zu spiel ich noch damit rum), bevor ich die komplexeren Sachen überhaupt angefangen habe.
-
@Mechanics Und was hat dir am Meisten zugesagt?
-
Eigentlich nehmen sich die Frameworks nicht so viel, die meisten sind irgendwie ähnlich... MFC und Java Swing hatten mir nicht gefallen, vor allem natürlich MFC.
Am meisten hab ich mit Winforms, Qt Widgets und VCL gemacht. Und die sind eigentlich schon ziemlich ähnlich. Auch das alte VB Framework, wxWidgets usw.. Da sind jetzt keine so riesigen Unterschiede, man kommt mit allen denke ich ähnlich gut zurecht. Kommt so ein bisschen drauf an, was man braucht - WinForms hatte z.B. mehr Data-Binding Funktonalität.
WPF unterscheidet sich ziemlich deutlich davon, fand ich ganz nett, aber für einfache GUIs eher übertrieben. Hat eine gewisse Ähnlichkeit mit QML, würde ich aber als mächtiger und deutlich "besser" einstufen. Besser im Sinne von, man kann damit viel einfacher arbeiten, ohne dass man alle zwei Zeilen erstmal aufgeschmissen ist.Was die "modernen" HTML5 Frameworks angeht, wie Angular oder React, an sich finde ich die nicht schlecht, aber mit CSS kann ich nichts mehr anfangen. Da kann ich noch strukturell dran mitarbeiten, aber nicht mehr fullstack die komplette GUI mitentwickeln. Für sowas verschwende ich keine Zeit mehr.
-
Eins muss ich Qt zu Gute halten: Es hat mich dazu veranlasst, mich mit neuen Technologien auseinanderzusetzen:
Ich werde das nun in Elm umsetzen.
-
Schon wieder was neues... Ich dachte, dieser Wahn hätte langsam aufgehört
p.s. Ist nicht so neu, war mir nur nicht geläufig. Hat sich anscheinend nicht durchgesetzt, wird sich vermutlich auch nicht durchsetzen. Ist aber nur mein erster Eindruck, kann das natürlich nicht fundiert beurteilen.