2017-09-18 2 views
2

Mon application contient du code tiers, qui peint quelque chose en utilisant OpenGL. Seulement je peux faire est de fournir la pleine surface d'écran pour elle et les événements de souris/écran tactile. Dites que je peux créer Item en taille plein écran et le laisser pour ce rendu tiers. Le rendu émet des signaux pour moi (peut-être à partir de threads arbitraires, au moyen de QMetaObject::invokeMethod) pour mettre à jour la vue. Comment bloquer QML pour peindre dans le contexte temporairement?Comment fournir le contexte OpenGL d'un élément QML vide pour un rendu tiers?

Comment décrit ci-dessus peut être mis en œuvre? Est-il techniquement possible de créer un tel flux de travail?

Y a-t-il un moyen plus sage de réaliser ce que l'on souhaite? Peut-être que l'utilisation de FBO serait mieux?

Puis-je le faire de manière asynchrone? C'est à dire. ce rendu a son propre message quque en thread séparé.

+3

La documentation (http://doc.qt.io/qt-5/qtquick-visualcanvas-scenegraph.html) [Qt Scène rapide graphique] page décrit diverses options pour l'intégration. Cela aidera à rendre la question plus spécifique. – Velkan

Répondre

2

Vous devriez jeter un oeil sur QQuickFramebufferObject.

La façon dont cela fonctionne:

Vous créez une sous-classe et instancier en QML. Vous devez remplacer son

Renderer *QQuickFramebufferObject::createRenderer() 

Vous créez votre propre sous-classe de Renderer http://doc.qt.io/qt-5/qquickframebufferobject-renderer.html

Tout le code que vous mettez dans son vide Renderer::render() affectera la FBOItem et être rendu à l'écran. Qt est en charge de lier votre FBO.

Maintenant, si vous avez besoin d'appeler pour une modification dans l'interface utilisateur, vous appelez le void Renderer::update().

Votre moteur de rendu tiers doit appeler cette méthode lorsqu'il doit dessiner, mais toutes vos méthodes opengl (glDrawArrays ...) doivent être écrites dans la fonction de rendu du Renderer. Qt lie votre FBO avant d'accéder à cette méthode. Peut-être que votre QQuickFramebufferObject devrait écouter vos signaux ThirdParty et modifier (via certains états, ou std :: functions) la méthode render de ses composants Renderer et appeler une mise à jour.

Voici quelques bons exemples

http://blog.qt.io/blog/2015/05/11/integrating-custom-opengl-rendering-with-qt-quick-via-qquickframebufferobject/