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:
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
@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
Oui, c'est ce que je veux dire, en particulier le choix des couleurs de QGLWidget. – BjkOcean