2
我有一个用户界面,我使用QT设计器设计,并使用pyqt4进行转换。在这个用户界面我有表格,标签和更多...在Pyqt窗口中使用glfw窗口
我想在该用户界面中添加一个glfw窗口,将交互这些表并绘制一些3D对象。所以我会在这个glfw窗口中使用pyopengl。我知道如何在单独的窗口中做到这一点,但这个窗口必须在里面。有没有办法做到这一点?
感谢
我有一个用户界面,我使用QT设计器设计,并使用pyqt4进行转换。在这个用户界面我有表格,标签和更多...在Pyqt窗口中使用glfw窗口
我想在该用户界面中添加一个glfw窗口,将交互这些表并绘制一些3D对象。所以我会在这个glfw窗口中使用pyopengl。我知道如何在单独的窗口中做到这一点,但这个窗口必须在里面。有没有办法做到这一点?
感谢
的Qt有称为QGLWidget与您可以使用您的典型PyOpenGL命令OpenGL上下文一个内建的小工具。你可能想尝试在你的应用中使用GLFW上下文而不是鞋楦。这answer应该可以帮助你获得运行。如果您已经编写了3D可视化部分,则可能需要进行一些重构,但是,由于要使用此小部件,您需要实现某些功能,例如和paintGL
。
编辑:
至于有关处理鼠标事件,使颜色采摘的评论你的问题,因为这关键是要认识到,QGLWidget
继承QWidget
。这意味着您可以访问您可以实现的功能,如mousePressEvent
。这里是一个整洁的演示(有一些有益的意见),我写了,告诉他们点击的用户和像素的颜色:
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_()
结果看起来是这样的:
我很好地使用你所指的答案,这个答案只允许我在这个OpenGL窗口上绘制3D对象。但是,我还希望从该窗口收到信号,我相信这只允许使用glfw类型的图书馆? – BjkOcean
@BjkOcean我个人没有使用过GLFW和PyQt;我主要使用sdl2上下文进行渲染。对于信号,你是在谈论接收键盘和鼠标输入,处理窗口大小调整,还是不同的东西? – CodeSurgeon
是的,这就是我所指的,特别是从QGLWidget中挑选颜色。 – BjkOcean