Qt5. Incorporer QWidget objet en QML
Je suis à l'aide de Qt5 bêta et en essayant d'incorporer un QWidget objet en QML. Le but est d'utiliser QML autant que possible, et de n'utiliser QWidget objets où QML ne pas faire ce dont j'ai besoin. J'ai trouvé un lien expliquant comment faire pour Qt4.7, mais je n'ai pas trouvé d'information expliquant comment faire en Qt5.
http://doc.qt.digia.com/4.7/declarative-cppextensions-qwidgets.html
Le même exemple est également disponible dans les Qt5 des exemples de dossier sous:
exemples\qtquick1\déclarative\cppextensions\qwidgets
Malheureusement, cet exemple utilise QtQuick 1, plutôt que de QtQuick 2, et je voudrais utiliser les nouvelles fonctionnalités de Qt5. Je veux intégrer une qwt widget, mais comme une première étape, je serais heureux d'intégrer toute simple QWidget objet.
Quelqu'un peut-il m'aider à obtenir le exemple de travaillant sous Qt5 /QtQuick 2 ?
- Quelques nouvelles concernant ceci: QtQuickWidget résout l'inverse de ce problème; c'est, l'intégration de Qt Quick éléments dans les widgets. Il sera disponible en Qt 5.3.
Vous devez vous connecter pour publier un commentaire.
Qt Quick 2 utilise un graphe de scène pour un rendu efficace sur le GPU. Malheureusement, ce qui rend impossible d'intégrer classique des widgets dans la scène. L'ancienne approche pour incorporer ces widgets avec l'aide de
QGraphicsProxyWidget
ne fonctionne qu'avec Qt Quick 1, car intérieurement il utilise unQGraphicsView
pour tout le levage lourd etQGraphicsProxyWidget
est destiné à être utilisé avec elle.Comme de maintenant, il n'y a pas de plans pour permettre l'incorporation de classique QWidgets dans le graphe de scène que je connais. Je pense que c'est plutôt rare de changer, parce que les concepts de QPainter, la peinture du cadre utilisé pour la classique des widgets, et la nouvelle scène graphique ne joue pas bien les uns avec les autres.
Il y a quelques efforts pour développer de nouveaux widgets de jeux spécifiquement conçus pour les besoins de QML, mais aucun n'est aussi puissant et mature comme le classique des widgets. Les plus importantes sont la QML Commandes Rapides, livré avec Qt depuis la version 5.1.
Si vous dépendent vraiment de QWT mon conseil serait de rester avec Qt Quick 1.1 pour l'instant. Il est toujours livré avec Qt 5, probablement pour des cas comme le vôtre. De cette façon, vous ne prenez pas avantage de la nouvelle scène graphique, si.
Ce qui pourrait être fait est de rendre le widget à l'image et à télécharger comme texture.Pour l'interaction quelqu'un a besoin de transférer des événements comme clic de souris ou keyPressed de la scène graphique, traduire widget de coordonnées, de transmettre, de rendu et de télécharger de la texture de nouveau. Juste une idée 🙂
L'approche recommandée est de rester avec un QWidget en fonction de l'application et incorporer le QML pièces à l'aide de QWidget::createWindowContainer.
Vous pouvez incorporer QWidget pour QML en utilisant QQuickPaintedItem classe:
http://doc.qt.io/qt-5/qquickpainteditem.html
Qt5 est un exemple:
http://doc.qt.io/qt-5/qtquick-customitems-painteditem-example.html
Vous devez mettre en œuvre un inhérente de QQuickPaintedItem avec salle de widget attribut que vous souhaitez intégrer. Fournir la méthode de peinture, qui vient de rendre l'QtWidget et de fournir de la souris et d'autres cas de la transmission d'hériter de QQuickPaintedItem à intégrer QtWidget.
Il y a aussi guide de démarrage rapide (Qt scene graph API), mais mon expérience avec cette chose n'était pas lisse. Je crois que l'idée de multithreading (en effectuant le rendu dans le thread différent (pas le Qt GUI thread, mais sur Windows qui n'est pas vrai et tout est fait dans les principales thread GUI).
J'ai mis en place l'incorporation de QCustomPlot, voici le lien: github.com/mosolovsa/qmlplot
Encore à Julien de réponse - un moyen simple d'y parvenir est d'utiliser QQuickWidget pour afficher le QML scène, puis ajouter régulièrement un QWidget comme un enfant de la QQuickWidget. Vous pouvez également ajouter un simple intermédiaire de QObject, pour l'ancrage de l'QWidget à un élément de la scène.
E. g.:
En main.qml:
widgetanchor.h:
Dans main.cpp:
La documentation indique que l'utilisation de QQuickWidget a des avantages sur QQuickView et QWidget::createWindowContainer, comme aucune restriction sur l'ordre d'empilement, mais a un mineur de performances'.
Espère que ça aide.
Ici explique comment ajouter QComboBox sur QML mise en fonction. Pense que ce sera le bon exemple à votre cas. (En Qt 5.9 mise en œuvre indigène ComboBox QML contrôle).