2015-08-25 89 views
0

後,我有一個了QDialog,我在那裏創建一個QTimer對象,這將觸發每ň秒的功能。關閉對話框(按下x按鈕)後,計時器仍然開始工作,似乎沒有被銷燬。我怎樣才能阻止它?目前作爲解決方法,我明確地呼籲Qtimer.stop()當進入closeEvent()QTimer運行對話框關閉

我希望當窗口關閉時,即使當我明確調用解構器時,每個類成員都會被刪除,Qtimer對象仍然存在。

from PyQt4 import QtGui, QtCore 
import sys 



def update(): 
    print "tick..." 

class Main(QtGui.QDialog): 

    def __init__(self, parent = None): 
     super(Main, self).__init__(parent) 


     self.timer = QtCore.QTimer() 
     self.timer.timeout.connect(update) 
     self.timer.start(2000) 

     # scroll area 
     self.scrollArea = QtGui.QScrollArea() 
     self.scrollArea.setWidgetResizable(True) 

     # main layout 
     self.mainLayout = QtGui.QVBoxLayout() 


     self.setLayout(self.mainLayout) 


    def closeEvent(self, evt): 
     print "class event called" 
     self.timer.stop() 

myWidget = Main() 
myWidget.show() 

回答

3

http://doc.qt.io/qt-5/timers.html

定時器功能的主要API是QTimer。該類 提供了定時器在計時器觸發時發出信號的定時器,並且 繼承QObject,因此它很適合大多數GUI程序的所有權結構 。使用它的正常方式是這樣的:

QTimer *timer = new QTimer(this); 
connect(timer, SIGNAL(timeout()), this, SLOT(updateCaption())); 
timer->start(1000); 

QTimer對象做成這個小部件的一個孩子,這樣,當 這個小部件被刪除,計時器也被刪除。接下來,它的timeout() 信號連接到將執行工作的插槽,它將以1000毫秒的值啓動 ,表示它將每秒超時 。

在C++中,定時器父的小部件或其他QObject,然後他們的壽命是聯繫在一起的QObject的壽命,但它仍然是很好的做法,停止計時器,當你不需要它。當您撥打setLayout時,版面會變爲父版。計時器不知道它的父項,所以當小部件被銷燬時它不會被銷燬。它只是坐在堆上,仍然在QApplication事件循環中運行。

http://doc.qt.io/qt-5/qobject.html#setParent

所以無論是在自我傳遞給QTimer的構造,或致電setParentQTimer將其設置到對象樹正常。

http://doc.qt.io/qt-5/objecttrees.html

更新:顯然,setParent沒有在PyQt的工作。只需在QTimer的構造函數中傳入self即可。

希望有所幫助。

+0

感謝您的回覆,我嘗試了setParent(self)和setParent(self.parent),但它沒有奏效。我有什麼想法嗎? – user1767754

+0

@ user1767754您可能還需要設置對話框的['Qt.WA_DeleteOnClose'](http://doc.qt.io/qt-4.8/qt.html#WidgetAttribute-enum)屬性,以便對話框(和它是兒童)實際上被刪除。 –

+0

其實設置:self.timer = QtCore.QTimer(self)解決了這個問題,setParent被凍結。如果你可以將這個納入你的答案,我會將其標記爲正確的答案。感謝您的幫助,但。 – user1767754