QT + OpenGL循环事件

时间:2016-02-13 03:17:45

标签: qt python-3.x opengl

是否存在类似于QWindow.KeyPressEvent()的触发器或信号或事件,而是每次调用循环时触发?

我使用Python3,PyQt5和PyOpenGL在QT窗口内创建一个OpenGL小部件,这样我就可以绘制一些二维对象(将来某天可能会有3d)。我有一个上下文工作,可以绘制一些对象,但我希望它能定期更新。现在我的OpenGL Window类中有一个方法可以覆盖keyPressEvent。这适用于一次性渲染,但它也限制了循环。我喜欢的是每次QT循环出现时都会渲染我的OpenGL小部件。

免责声明:我知道这会使我的CPU速度非常快,所以我每次使用QTimer最多等待16ms(取决于渲染场景所需的时间),不再限制它每秒60次渲染。

任何帮助都表示赞赏,如果你对这种渲染方法有批评,请告诉我!感谢。

编辑:我尝试用计时器手动调用我的渲染。问题是,我无法找到一种让计时器本身不止一次起火的方法! (我没有使用单打)我无法弄清楚计时器的去向。一旦我调用了我的window.show(),它就构建自己,绘制我的场景一次,并等待事件。如果我在显示窗口之前放置计时器,我的场景就会出错(没有任何要画)。如果我在我的窗口类的init中添加计时器,它只会触发一次。当然,如果我把它放在我用来更新窗口的类中,它会在完成之前以递归方式调用自己(我无法想象我的RAM会被激活......)

这就是为什么我只是在显示我的窗口或我的应用程序正在运行时寻找信号的原因 - 类似于QEvent :: WindowActivated而不是QEvent :: WindowActivate。始终打开的信号。

我觉得我可能正在咆哮错误的树,但我不确定如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

最后!启示!你是对的,peppe。计时器工作,我把它放在错误的地方。我没有想到的地方是在调用window.show()之后把它放在主函数中。这就是我在做什么,以及有用的:

class mainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        #Window stuff here
        loop=QtCore.QTimer()
        loop.timeout.connect(gl.update)
        loop.start(0)

class gl(gl.GLWindow):
    def update(self):
        print('x')

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    printing=printingclass()
    window = mainWindow()
    window.show()
    sys.exit(app.exec_())

我需要做什么:

class mainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        #Window stuff here

class gl(gl.GLWindow):
    def update(self):
        print('x')

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    printing=printingclass()
    window = mainWindow()
    window.show()
    loop=QtCore.QTimer()
    loop.timeout.connect(gl.update)
    loop.start(0)
    sys.exit(app.exec_())

将其与另一个等待时间长达17ms的计时器相结合,取决于渲染时间,我可以将渲染限制为60fps(或我拍摄的任何帧速率)。