2017-09-15 6 views
2

J'ai une interface utilisateur que j'ai conçue en utilisant le concepteur QT, et convertie en utilisant pyqt4. Dans cette interface utilisateur j'ai des tables, des onglets et plus ...Utilisation de la fenêtre glfw à l'intérieur de la fenêtre Pyqt

Je voudrais également ajouter une fenêtre glfw à l'intérieur de cette interface utilisateur qui va interagir avec ces tables et dessiner quelques objets 3D. Donc, je vais utiliser pyopengl dans cette fenêtre de glfw. Je sais comment faire cela dans une fenêtre séparée, mais cette fenêtre doit être à l'intérieur. Est-ce qu'il y a un moyen de faire ça ?

Merci

Répondre

0

Qt a un widget pour un contexte builtin OpenGL appelé QGLWidget avec laquelle vous pouvez utiliser vos commandes de pyopengl typiques. Vous voudrez peut-être essayer d'utiliser cela au lieu de faire du «cow-boy» dans un contexte GLFW dans votre application. Ce answer devrait vous aider à le faire fonctionner. Cela peut nécessiter une certaine restructuration si vous avez déjà écrit la partie de visualisation 3D. Toutefois, pour utiliser ce widget, vous devez implémenter certaines fonctions, telles que initializeGL et paintGL.

Edit:

Quant à votre question dans les commentaires sur le traitement des événements de la souris pour permettre la sélection des couleurs, l'astuce pour c'est de réaliser que QGLWidget hérite de QWidget. Cela signifie que vous avez accès à des fonctions telles que mousePressEvent que vous pouvez implémenter. Voici une démo soignée (avec quelques commentaires utiles) que j'ai écrit qui indique à l'utilisateur où ils ont cliqué et la couleur de ce pixel:

from OpenGL.GL import * 
from OpenGL.GLU import * 
from PyQt4 import QtGui 
from PyQt4.QtGui import QColor, QStatusBar, QSizePolicy 
from PyQt4.QtOpenGL import * 
import sys 

class MainWindow(QtGui.QWidget): 

    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.widget = GLWidget(self) 
     self.statusbar = QStatusBar() 
     self.statusbar.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) 
     self.statusbar.showMessage("Click anywhere on the QGLWidget to see a pixel's RGBA value!") 
     layout = QtGui.QVBoxLayout() 
     layout.addWidget(self.widget) 
     layout.addWidget(self.statusbar) 
     layout.setContentsMargins(5, 5, 5, 5) 
     self.setLayout(layout) 

class GLWidget(QGLWidget): 

    def __init__(self, parent): 
     QGLWidget.__init__(self, parent) 
     self.setMinimumSize(640, 480) 
     #LMB = left mouse button 
     #True: fires mouseMoveEvents even when not holding down LMB 
     #False: only fire mouseMoveEvents when holding down LMB 
     self.setMouseTracking(False) 

    def initializeGL(self): 
     glClearColor(0, 0, 0, 1) 
     glClearDepth(1.0) 
     glEnable(GL_DEPTH_TEST) 

    def resizeGL(self, width, height): 
     #glViewport is needed for proper resizing of QGLWidget 
     glViewport(0, 0, width, height) 
     glMatrixMode(GL_PROJECTION) 
     glLoadIdentity() 
     glOrtho(0, width, 0, height, -1, 1) 
     glMatrixMode(GL_MODELVIEW) 
     glLoadIdentity() 

    def paintGL(self): 
     #Renders a triangle... obvious (and deprecated!) stuff 
     w, h = self.width(), self.height() 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
     glBegin(GL_TRIANGLES) 
     glColor3f(1, 0, 0) 
     glVertex3f(0, 0, 0) 
     glColor3f(0, 1, 0) 
     glVertex3f(w/2.0, h, 0) 
     glColor3f(0, 0, 1) 
     glVertex3f(w, 0, 0) 
     glEnd() 

    def mousePressEvent(self, event): 
     x, y = event.x(), event.y() 
     w, h = self.width(), self.height() 
     #required to call this to force PyQt to read from the correct, updated buffer 
     #see issue noted by @BjkOcean in comments!!! 
     glReadBuffer(GL_FRONT) 
     data = self.grabFrameBuffer()#builtin function that calls glReadPixels internally 
     data.save("test.png") 
     rgba = QColor(data.pixel(x, y)).getRgb()#gets the appropriate pixel data as an RGBA tuple 
     message = "You selected pixel ({0}, {1}) with an RGBA value of {2}.".format(x, y, rgba) 
     statusbar = self.parent().statusbar#goes to the parent widget (main window QWidget) and gets its statusbar widget 
     statusbar.showMessage(message) 

    def mouseMoveEvent(self, event): 
     pass 

    def mouseReleaseEvent(self, event): 
     pass 

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    window = MainWindow() 
    window.setWindowTitle("Color Picker Demo") 
    window.show() 
    app.exec_() 

Le résultat ressemble à ceci:

enter image description here

+0

Je suis d'accord avec la réponse à laquelle vous faites référence, cette réponse me permet seulement de dessiner les objets 3D sur cette fenêtre OpenGL. Cependant, je voudrais également recevoir des signaux de cette fenêtre, que je crois seulement permise avec le type de bibliothèques de glfw juste? – BjkOcean

+0

@BjkOcean Personnellement, je n'ai pas utilisé GLFW ni PyQt; J'ai surtout fait du rendu en utilisant un contexte sdl2. Pour les signaux, parlez-vous de la réception du clavier et de la souris, du traitement du redimensionnement des fenêtres ou de quelque chose de différent? – CodeSurgeon

+0

Oui, c'est ce que je veux dire, en particulier le choix des couleurs de QGLWidget. – BjkOcean