2017-09-15 260 views
2

我有一個用戶界面,我使用QT設計器設計,並使用pyqt4進行轉換。在這個用戶界面我有表格,標籤和更多...在Pyqt窗口中使用glfw窗口

我想在該用戶界面中添加一個glfw窗口,將交互這些表並繪製一些3D對象。所以我會在這個glfw窗口中使用pyopengl。我知道如何在單獨的窗口中做到這一點,但這個窗口必須在裏面。有沒有辦法做到這一點?

感謝

回答

0

的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_() 

結果看起來是這樣的:

enter image description here

+0

我很好地使用你所指的答案,這個答案只允許我在這個OpenGL窗口上繪製3D對象。但是,我還希望從該窗口收到信號,我相信這隻允許使用glfw類型的圖書館? – BjkOcean

+0

@BjkOcean我個人沒有使用過GLFW和PyQt;我主要使用sdl2上下文進行渲染。對於信號,你是在談論接收鍵盤和鼠標輸入,處理窗口大小調整,還是不同的東西? – CodeSurgeon

+0

是的,這就是我所指的,特別是從QGLWidget中挑選顏色。 – BjkOcean