2014-01-07 2 views
4

Я использую Qt из python с привязками PySide. Основная часть моего приложения - это представление OpenGL, которое может быть изменено до определенного значения (это симулятор для тестирования моей игры в разных разрешениях мобильных устройств). Я использую QGLWidget для рендеринга графики из своего игрового движка и QScrollArea для прокрутки.QGLWidget не перемещает его содержимое на прокрутке

Когда я пытаюсь прокрутить GL-просмотр, ничего не происходит - он остается в одном месте, но координаты QGLWidget обновляются точно, что я вижу в отчетах о печати.

Игра с изменением размера главного окна Я пришел к выводу, что все внутри QGLWidget привязано к нижнему левому углу видимой области. Поэтому это объясняет, почему я не вижу прокрутки.

Я должен обновить матрицу проекции вручную?

+0

Итак, у вас есть 'QGLWidget' внутри' QScrollArea'? Что именно вы ожидаете, когда будете прокручиваться? – 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: 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

Возможно, эта проблема связана с ограничениями какао при работе с GLView. Вот строка из Qt docs об этом: «У QGLWidget не могут быть какие-либо виджеты sibling, размещенные ontop сами по себе. Это связано с ограничениями в API Cocoa и не поддерживается Apple». – Vavius

Смежные вопросы