2014-01-07 1 views
4

Python에서 PySide 바인딩을 사용하여 Qt를 사용하고 있습니다. 내 응용 프로그램의 주요 부분은 특정 값으로 크기를 조정할 수있는 OpenGL보기입니다 (이것은 모바일 장치의 다양한 해상도에서 내 게임을 테스트하기위한 시뮬레이터입니다). QGLWidget을 사용하여 내 게임 엔진의 그래픽을 렌더링하고 QScrollArea를 사용하여 스크롤합니다.QGLWidget이 스크롤 할 때 내용을 이동하지 않습니다.

GL 뷰를 스크롤 할 때 아무 일도 일어나지 않습니다. 단지 같은 위치에 머물러 있지만 QGLWidget의 좌표는 print 문을 통해 볼 수 있도록 업데이트됩니다.

메인 윈도우의 크기를 조정하여 재생하기 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_()) 
  • OS : 윈도우 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 다루는 관련이 있습니다. "QGLWidget은 Cocoa API의 제한으로 인해 형제 위젯이 ontop에 위치 할 수 없으며 Apple에서 지원하지 않습니다." – Vavius