2017-07-07 2 views
1

ich die folgende Frage in Bezug auf QML mit qml geladenes Objekt Loader(setSource("qmlObject.qml")).QML - Austauschtag zwischen C++ Klasse und Klasse erstellt von QmlRegisterType

In qmlObject.qml I objectClass(.h/.cpp) erstellt mit qmlRegisterType importiert haben, also wenn ich loader.setSource("qmlObject.qml") Befehl eine Instanz starten von objectClass(.h/.cpp) ist erstellt.

Ich habe andere Hauptklasse namens coreClass(.h/.cpp) und ich sollte Daten zwischen objectClass(.h/.cpp) und coreClass(.h/.cpp) austauschen.

Was ist die beste Vorgehensweise, um diese Funktion in meiner einfachen qt-Anwendung zu implementieren?

Antwort

3

Es gibt zwei Möglichkeiten, das zu tun:

  1. auf C++ Ebene, da sowohl Ihre Objekte C++ Objekte können Sie QML als Vermittler überspringen verwenden und direkt kommunizieren. Vermutlich ist Ihre Hauptklasse eine für die gesamte Anwendung, so dass Sie sie als statischen Member-Zeiger auf den Core in Ihrer Objektklasse verfügbar machen können. Daher haben alle Objektklasseninstanzen Zugriff darauf.

  2. auf QML-Ebene, indem die Kernklasse QML als Kontexteigenschaft oder vorzugsweise als Singleton ausgesetzt wird, da letzteres der effizienteste Weg ist. Dann können Sie seine Eigenschaften, Signale und Slots (aber nicht reines öffentliches C++ - Zeug) in Form einer definierten funktionalen Schnittstelle verwenden.

Der erste Ansatz wird viel schneller Leistung klug sein und weniger Speicher verwenden, ist die Kehrseite Sie den C++ Code bei jeder Änderung neu kompiliert werden müssen.

Der zweite Ansatz beschränkt die Interaktion auf das, was in QML sichtbar ist. Dies sind Eigenschaften, Signale, Slots und Funktionen, die als aufrufbar markiert wurden. Es wird langsamer sein und mehr Speicher benötigen, aber auf der Oberseite müssen Sie nicht neu kompilieren, so dass das Prototyping viel schneller ist.

Oft sind solche Interaktionen GUI-basiert, so dass der Overhead nicht wirklich wichtig ist, da der Benutzer tausende Male pro Sekunde nicht mit der GUI interagiert. Wenn Effizienz der Schlüssel ist, können Sie mit dem zweiten Ansatz einen Prototyp erstellen und Dinge schneller ausführen. Wenn Sie fertig sind, portieren Sie den Code einfach in die erste Lösung.

Es ist auch wichtig zu erwähnen, dass, wenn Sie C++ zu QML-Integration tun, der korrekte Weg wäre, die C++ - Inhalte QML zur Verfügung zu stellen und sie von QML zu verwenden. Sie sollten niemals von C++ auf beliebige Dinge in QML zugreifen müssen, dies ist ein Hinweis auf falsches Design.

0

Sie können einfach Daten zwischen C++ Klassen mit SIGNAL und SLOT-Mechanismus austauschen. übergeben Sie einfach den Zeiger der coreClass an objectClass und verbinden Sie das Signal und die Slots.

+0

Aber die Instanz von objectClass wird von qml Loader, nicht von coreClass generiert. Von CoreClass weiß ich nicht, was die relative objectClass ist, um Schlitze und Signale auszutauschen. – daniele86

+0

Ich weiß nicht, was bedeutet: 'Instane von objectClass wird aus qml Loader' generiert. Sie können jedoch objectClass und coreClass in der Funktion main() deklarieren und sie dann an qml übergeben. Auf diese Weise können Sie Zeiger zueinander weitergeben. –

Verwandte Themen