0
votes

Pourquoi la boucle tandis que dans la boucle Qt ne bloque pas l'interface graphique QT

J'utilise GLFW avec QT pour une application OpenGL.

J'ai une boucle de temps à l'intérieur de la fonction principale.

Pourquoi la boucle de Throue ne bloque pas l'interface graphique Qt? xxx

}


9 commentaires

Qu'est-ce qui vous fait conclure que cela ne bloque pas?


@Darklighter Je suis libre de cliquer sur le bouton de l'interface graphique et des boutons selon leur signal et ses emplacements.


J'aurais dû avoir une sorte de sensation de gel si les boutons où bloqués.


Qu'est-ce que w.Render () faire?


Essayez d'ajouter qpushbutton pb ("appuyez sur"); pb.show (); immédiatement avant tandis que (! GLFWWINDOWSHDLOllose (fenêtre)) . Pouvez-vous interagir avec le bouton-poussoir?


@Darklighter w.Render a des appels de rendu opengl.


@ G.m Le code du bouton s'exécute une fois.


Je ne sais pas ce que vous voulez dire par "le code de bouton exécute une fois" . Vous ne pouvez pas interagir avec le bouton tant que A.Exec () est appelé - après la fin de la boucle GLFW. Notez que vous avez déjà donné de bons conseils sur la manière de procéder à cela dans Cette réponse à une question précédente.


@ G.m La réponse de DarkLighter met en lumière pourquoi le code s'exécute une fois.


3 Réponses :


0
votes

Vous ne démarrez même pas la boucle d'événement QT Application, car vous n'appelez pas l'A.EXEC () comme votre code est I Side de la boucle. Je ne suis pas expert OpenGL, mais je suppose que la fenêtre que vous voyez est celle rendue par OpenGL elle-même pas une toile GL dans la fenêtre de l'application Qt.


0 commentaires

1
votes

Il semble que GLFWPollevants agit de manière suffisamment similaire à QApplication :: EXEC telle que (certains) événements sont correctement traités.
Ils appellent probablement tous les deux DispatchMessage ( voir ) qui permet ensuite de rappeler le rappel enregistré Pour une fenêtre gérer l'événement.
Mais il pourrait également s'agir d'une comptabilité supplémentaire qui pourrait faire la dépendance à cette erreur.


0 commentaires

1
votes

Vous n'utilisez pas du tout la pompe d'événement QApplication, vous êtes court-circuité sur Moodle \ GLFW \ Wavefront Bibliothèque Bibliothèque.

Support OpenGL de Qt via QopengLwidget fonctionne directement avec Paintgl Méthode qui doit effectuer tous les rendu et qui s'appelle à l'intérieur de la boucle d'événement. Si vous n'utilisez pas cela, vous aurez une manière d'une manière ou d'une autre, vous allez combiner deux threads, qui est problématique que le pipeline OpenGL et la boucle principale QT sur certaines plates-formes ne sont généralement utilisables que dans le fil principal.


8 commentaires

Oui, c'est le problème que je suis confronté à l'initiellement que tout le rendu OpenGL a été fait dans un autre fil, mais j'ai réalisé que GL_Deleetebuffer n'était pas en mesure de supprimer la VAO, VBO.


@Summit Attendez-vous que la bibliothèque wagonne ou une classe que vous avez appelée WaveFronTrender (par exemple parce que vous rendant objs)?


C'est une classe que j'ai créée.


@Summit peut-être que vous devriez peut-être utiliser directement l'utilisation directe d'Abadon GLFW et déplacer ce rendu () appel à Qopenglwidget's's's's's's's's's's's's> Paintgl . Sinon, je ne sais pas pourquoi vous avez besoin de qt.


Cette classe est dérivée de Qmainwidow


Ouais c'est une idée fantastique.


@Summit c'est trop mystérieux. Est-il enrçonné autour de Qmainwindow avec QopenglWidget à l'intérieur? Comment vous attendez-vous à exécuter une boucle d'événement si l'objet QaPlLication laissé à l'extérieur et .exeec () n'a jamais été appelé?


J'ai besoin de qt pour l'interface graphique car le concepteur concevrait des scènes (c'est une application de modélisation 3D)