Problem mit PyOpenGL/PyQt bei zeichnen der Szene

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
_patrice_
User
Beiträge: 6
Registriert: Dienstag 1. Juni 2010, 19:12

Hallo,

ich bin noch relativ neu in Python und komme noch nicht so ganz klar mit manchen Kleinigkeiten. Schreibe gerade eine GUI mittels PyQt die ein einfaches QGLWidget hat in dem ein paar geometrische Figuren gezeichnet werden sollen die mittels Buttons gesteuert werden. Klappt eigentlich auch alles ganz gut soweit, außer das ich es nicht in den Griff bekomme das bei jeder Aktion in meinem MainWidget meine Szene im QGLWidget neu gezeichnet wird. Dies passiert nämlich immer erst wenn ich das Window maximiere oder minimiere oder alt usw. drücke!

Wäre sehr dankbar für einen Tip was mir fehlt um dieses Problem in den Griff zu bekommen. Vielen Dank schonmal an alle Helfer.

Gruß

Code: Alles auswählen

#render.py

import sys
import math as m
from dataObj import *
from PyQt4 import QtCore, QtGui, QtOpenGL


try:
    from OpenGL.GL import *
    from OpenGL.GLU import *
    from OpenGL.GLUT import *
except ImportError, e:
    print e
    raise Exception('You should install PyOpenGL')


class MyGLWidget(QtOpenGL.QGLWidget):

    def __init__(self, parent = None):
        print "__init__ MyGLWidget\n"
        QtOpenGL.QGLWidget.__init__(self, parent)
        self.resize(320,149)
        self.setMinimumSize(320, 149)

.
.
.
        

    def InitializeGL(self):
        print "InitializeGL\n"
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        gluPerspective(45.0, self.width()/float(self.height()), 0.1, 1000.0)

        glutMainLoop()
        
                
    def resizeGL(self,w,h):
        print "resizeGL\n"
        glViewport(0, 0, w, h)
        self.__glWidth = w
        self.__glHeight = h
        self.initializeGL()
                
                
    def paintGL(self):
        print "paintGL\n"
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glClearColor(1.0, 1.0, 1.0, 1.0)
        glDisable(GL_DEPTH_TEST);

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0, self.__glWidth, self.__glHeight, 0)
        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()
            
        if(self.__dataLoaded):
            glColor3f(1.0,0.0,0.0)
            
            #draw labels
            for k in range(0,len(self.__currentDataList)):
                glPushMatrix()
                  .... #Hier wird was gezeichnet
                glPopMatrix()
                glFlush() #<-- bringt nichts

  
    

Code: Alles auswählen

#main.py


import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
from PyQt4.Qt import *
from dataObj import *
from render import *



class LabelViewer(QtGui.QWidget):
    def __init__(self, parent=None):
        print "__init__ LabelViewer\n"
        QtGui.QWidget.__init__(self, parent)
        
        #openGl Widget
        self.__oglWidget = MyGLWidget(self)

        self.next = QtGui.QPushButton("Next")
        self.prev = QtGui.QPushButton("Prev")

        self.connect(self.next, QtCore.SIGNAL('clicked()'), self.nextClicked)
        self.connect(self.prev, QtCore.SIGNAL('clicked()'), self.prevClicked)

.
.
.

    #Hier sollen per Button neue Daten in oglWidget gezeichnet werden, das tut aber immer erst wenn ich nach click das  
    #Fenster maximiere oder minimiere oder Alt drücke usw.
  
    #next frame button
    def nextClicked(self):
        self.__oglWidget.updateCurrentDataList('+')
        self.__oglWidget.initializeGL()
            
    #previous frame button
    def prevClicked(self):
        self.__oglWidget.updateCurrentDataList()
        self.__oglWidget.initializeGL()

.
.
.


if __name__ == '__main__':
    #create Mainwindow
    app = QtGui.QApplication(sys.argv)
    qb = LabelViewer()
    
    #check if started with labelfile
    if(len(sys.argv) == 2):
        file = str(sys.argv[1])
        if(file.find(".txt") != -1):
            qb.setFile(sys.argv[1])
        else:
            print "Wrong file format, labelfile have to be a .txt file!"
            sys.exit()
    elif(len(sys.argv) < 2):
        qb.setFile()
    else:
        print "Parameter Error, LabelViewer need one or no Parameter"
        sys.exit()


    qb.show()
    qb.initPos()
    sys.exit(app.exec_())
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

ich glaube du suchst repaint() oder mit dem QGLWidget updateGL()
http://doc.qt.nokia.com/4.6/qglwidget.html#updateGL
_patrice_
User
Beiträge: 6
Registriert: Dienstag 1. Juni 2010, 19:12

Danke, repaint() ist wunderbar! ;)
Antworten