2016-02-13 126 views
0

是否有像QWindow.KeyPressEvent()那樣的觸發器或信號或事件,但每次調用循環時都會觸發?我正在使用Python3,PyQt5和PyOpenGL在QT窗口中創建一個OpenGL小部件,所以我可以繪製一些二維對象(可能在將來的某一天有3d)。我有一個上下文工作,並可以繪製一些對象,但我希望它定期更新。現在我的OpenGL Window類中有一個覆蓋keyPressEvent的方法。這適用於一次性渲染,但它也限制了循環。我想要的是每次QT循環出現時都會呈現我的OpenGL小部件。我知道最大限度地提高CPU的速度非常快,所以我使用QTimer每次等待16ms(取決於渲染場景需要多少時間),將其限制爲不超過16ms每秒渲染60次。QT + OpenGL循環事件

任何幫助表示讚賞,如果您對這種渲染方法有所批評,請告訴我!謝謝。

編輯:我試過用定時器手動調用我的渲染。問題是,我找不到讓計時器本身不止一次啓動的方法! (我沒有使用單拍)我不知道計時器會去哪裏。一旦我調用我的window.show(),它構造自己,繪製我的場景一次,並等待事件。如果我在顯示窗口之前放置了計時器,我的場景將會出錯(無法繪製)。如果我在我的窗口類的init中添加計時器,它只會關閉一次。當然,如果我把它放在我用來更新窗口的類中,它會在完成之前遞歸地調用它自己(我無法想象我的RAM會接近......)

這就是爲什麼我在尋找對於只要我的窗口顯示或我的應用程序正在運行的信號 - 就像QEvent :: WindowActivated而不是QEvent :: WindowActivate。始終開啓的信號。

我覺得我可能會吠叫錯誤的樹,但我不知道如何解決問題。

+1

我不明白,使用計時器有什麼問題? – peppe

+0

創建一個定期觸發的定時器。只要你保持在計時器中完成的工作量相當小,它就可以正常工作。定時器的分辨率取決於操作系統。您也可以自己創建主循環並在其中添加閒置處理 – Jay

回答

0

終於!啓示!你是對的,貝貝。計時器確實有用,我把它放在了錯誤的地方。我沒有想到的地方是在調用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(或者我拍攝的任何幀速率)。