2017-07-07 1 views
1

J'ai la question suivante concerne qml objet chargé avec QML Loader(setSource("qmlObject.qml")).QML - date d'échange entre C++ classe et classe créée par QmlRegisterType

En qmlObject.qml j'ai importé objectClass(.h/.cpp) créé avec qmlRegisterType, donc quand je lance la commande loader.setSource("qmlObject.qml") une instance de objectClass(.h/.cpp) est créé.

J'ai une autre classe principale nommée coreClass(.h/.cpp) et je devrais échanger des données entre objectClass(.h/.cpp) et coreClass(.h/.cpp).

Quelle est la meilleure pratique pour implémenter cette fonctionnalité dans ma simple application qt?

Répondre

3

Il y a deux façons de le faire:

  1. au niveau C++, puisque les deux vos objets sont des objets C++, vous pouvez sauter en utilisant QML comme intermédiaire et communiquer directement. Vraisemblablement votre classe de base sera une pour l'application entière, ainsi vous pouvez l'exposer comme un pointeur de membre statique au noyau dans votre classe d'objet. Par conséquent, toutes les instances de classe d'objets y auront accès. En exposant la classe de base à QML en tant que propriété de contexte, ou de préférence en tant que singleton, car ce dernier est le moyen le plus efficace. Ensuite, vous pouvez utiliser ses propriétés, signaux et slots (mais pas du pur C++ public) sous la forme d'une interface fonctionnelle définie.

La première approche sera beaucoup plus rapide des performances sage, et utilisera moins de mémoire, l'inconvénient est que vous devrez recompiler le code C++ à chaque changement.

La deuxième approche limitera l'interaction à ce qui est visible dans QML, à savoir les propriétés, les signaux, les intervalles et les fonctions qui ont été marqués comme invocables. Il sera plus lent et utilisera plus de mémoire, mais à la hausse, vous n'aurez pas à recompiler, donc le prototypage est beaucoup plus rapide.

Souvent de telles interactions seront basées sur l'interface graphique, de sorte que le temps système n'aura pas vraiment d'importance, car l'utilisateur n'interagit pas avec l'interface graphique des milliers de fois par seconde. Si l'efficacité est la clé, vous pouvez utiliser la deuxième approche pour accélérer le processus et, lorsque vous avez terminé, vous n'avez qu'à porter le code à la première solution.

Il est également important de mentionner que lorsque vous effectuez une intégration C++ vers QML, la méthode correcte consiste à exposer le contenu C++ à QML et à l'utiliser à partir de QML. Vous ne devriez jamais avoir à passer de C++ à des choses arbitraires dans QML, c'est une indication d'un mauvais design.

0

Vous pouvez facilement échanger des données entre les classes C++ avec le mécanisme SIGNAL et SLOT. passez simplement le pointeur de coreClass à objectClass et connectez le signal et les slots.

+0

Mais l'instane de objectClass est généré à partir de qml Loader, pas de coreClass. De coreClass je ne sais pas quelle est l'objectClass relative pour échanger des slots et des signaux. – daniele86

+0

Je ne sais pas quel est le moyen: 'instane de objectClass est généré à partir de qml Loader'. mais vous pouvez déclarer objectClass et coreClass dans la fonction main(), puis les passer à qml. de cette façon, vous pouvez passer des pointeurs les uns aux autres. –