2014-01-07 104 views
4

我使用PySide绑定python的Qt。我的应用程序的主要部分是可以调整到特定值的OpenGL视图(这是用于在不同移动设备分辨率下测试我的游戏的模拟器)。我使用QGLWidget从我的游戏引擎和QScrollArea渲染图形进行滚动。QGLWidget不移动其滚动内容

当我试着滚动GL视图什么也没有发生 - 它只是停留在同一个地方,但QGLWidget的坐标更新很好,我通过打印语句看到了。

打开调整主窗口的大小我已经得出结论,QGLWidget中的所有内容都被捕捉到当前可见区域的左下角。所以这将解释为什么我看不到滚动。

我应该手动更新投影矩阵吗?

+0

所以你在'QScrollArea'里面有'QGLWidget'?当您滚动时,您预期会发生什么? – Fenikso

+0

我期望QGLWidget可以随其所有图纸一起移动。我可以通过缩放窗口来移动QGLWidget。 ScrollView对齐设置居中,QGLWidget保持居中在窗口中。但是我无法通过滚动来移动QGLWidget,所有的GL绘图都被捕捉到QGLWidget的当前可见矩形的左下角。 – Vavius

回答

1

这听起来像某种父母问题。这按预期工作:

import sys 
from PySide.QtGui import * 
from PySide.QtOpenGL import * 
from OpenGL.GL import * 
from OpenGL.GLU import * 

class GLWidget(QGLWidget): 
    def __init__(self, *args, **kwargs): 
     QGLWidget.__init__(self, *args, **kwargs) 

    def initializeGL(self): 
     glShadeModel(GL_SMOOTH) 
     glEnable(GL_DEPTH_TEST) 
     glClearColor(0.0, 0.0, 0.0, 1.0) 
     glClearDepth(1.0) 

    def resizeGL(self, w, h): 
     glMatrixMode(GL_PROJECTION) 
     glLoadIdentity() 
     glViewport(0, 0, w, h) 
     gluPerspective(45.0, w/h, 1, 1000) 

    def paintGL(self): 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
     glMatrixMode(GL_MODELVIEW) 
     glLoadIdentity()     
     glTranslatef(0.0, 0.0, -6.0)    
     glBegin(GL_TRIANGLES)     
     glColor3f(1.0, 0.0, 0.0)   
     glVertex3f(0.0, 1.0, 0.0)   
     glColor3f(0.0, 0.0, 1.0)   
     glVertex3f(-1.0, -1.0, 0.0)   
     glColor3f(0.0, 1.0, 0.0)   
     glVertex3f(1.0, -1.0, 1.0)   
     glEnd() 

class Window(QWidget): 
    def __init__(self, *args, **kwargs): 
     QWidget.__init__(self, *args, **kwargs) 

     self.scroll = QScrollArea(self) 
     self.glWidget = GLWidget(self.scroll) 
     self.glWidget.resize(600, 400) 
     self.scroll.setWidget(self.glWidget) 

     self.layout = QHBoxLayout() 
     self.layout.addWidget(self.scroll) 

     self.setLayout(self.layout) 
     self.resize(400, 300) 
     self.show() 

app = QApplication(sys.argv) 
win = Window() 
sys.exit(app.exec_()) 
  • 操作系统:Windows 7 SP1(32位)
  • PySide:1.2.1
  • 的Qt:4.8.5
  • PyOpenGL:3.0.2
+0

现在这听起来像我的设置问题。我使用PySide 1.2.1,Qt 4.8.5,Mac OS X 10.8.5。你的三角形是固定的,不会随着滚动条移动 – Vavius

+0

我在Windows 7上。库版本看起来一样,我明天可以检查PyOpenGL版本。 – Fenikso

+1

也许这个问题与处理GLViews时的Cocoa限制有关。下面是Qt文档中关于它的一行:“QGLWidget不能在它自己的顶部放置任何同级窗口小部件,这是由于Cocoa API的局限性,并且Apple不支持。 – Vavius