Python QTimer在对话框关闭后运行

Python QTimer在对话框关闭后运行,python,qt,pyqt4,Python,Qt,Pyqt4,我有一个QDialog,在这里我创建了一个QTimer对象,它每隔n秒触发一个函数。关闭对话框(点击x按钮)后,计时器仍在启动,似乎没有被破坏。我怎样才能阻止它?目前作为一种解决方法,我在输入closeEvent()时显式调用Qtimer.stop() 我希望在关闭窗口时删除每个类成员,即使我显式调用解构器时,Qtimer对象仍然存在 from PyQt4 import QtGui, QtCore import sys def update(): print "tick..."

我有一个QDialog,在这里我创建了一个QTimer对象,它每隔n秒触发一个函数。关闭对话框(点击x按钮)后,计时器仍在启动,似乎没有被破坏。我怎样才能阻止它?目前作为一种解决方法,我在输入closeEvent()时显式调用Qtimer.stop()

我希望在关闭窗口时删除每个类成员,即使我显式调用解构器时,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()

计时器功能的主要API是
QTimer
。那个班 提供定时定时器,在定时器触发时发出信号,以及 继承
QObject
,使其与 大多数GUI程序。通常的使用方法如下:

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(updateCaption()));
timer->start(1000);
QTimer
对象被制作成此小部件的子对象,以便 此小部件被删除,计时器也被删除。接下来,它的
timeout()
信号被连接到将进行工作的插槽,它被启动 值为1000毫秒,表示将超时 每一秒

<>在C++中,计时器对小部件或另一个代码> QObjult<代码>进行了表示,然后它们的寿命与QObjult/Cuth>的寿命相关,但是在不需要时停止一个定时器仍然是一个很好的实践。当您调用
setLayout
时,布局将成为父级。计时器不知道它的父对象,因此当小部件被销毁时,它不会被销毁。它只是位于堆上,仍然由
QApplication
事件循环运行

因此,要么将self传递给
QTimer
的构造函数,要么调用
QTimer
上的
setParent
将其正确设置到对象树中

更新:显然,
setParent
在PyQt中不起作用。只需在
QTimer
构造函数中传入
self

希望有帮助。

计时器功能的主要API是
QTimer
。那个班 提供定时定时器,在定时器触发时发出信号,以及 继承
QObject
,使其与 大多数GUI程序。通常的使用方法如下:

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(updateCaption()));
timer->start(1000);
QTimer
对象被制作成此小部件的子对象,以便 此小部件被删除,计时器也被删除。接下来,它的
timeout()
信号被连接到将进行工作的插槽,它被启动 值为1000毫秒,表示将超时 每一秒

<>在C++中,计时器对小部件或另一个代码> QObjult<代码>进行了表示,然后它们的寿命与QObjult/Cuth>的寿命相关,但是在不需要时停止一个定时器仍然是一个很好的实践。当您调用
setLayout
时,布局将成为父级。计时器不知道它的父对象,因此当小部件被销毁时,它不会被销毁。它只是位于堆上,仍然由
QApplication
事件循环运行

因此,要么将self传递给
QTimer
的构造函数,要么调用
QTimer
上的
setParent
将其正确设置到对象树中

更新:显然,
setParent
在PyQt中不起作用。只需在
QTimer
构造函数中传入
self

希望有帮助。

计时器功能的主要API是
QTimer
。那个班 提供定时定时器,在定时器触发时发出信号,以及 继承
QObject
,使其与 大多数GUI程序。通常的使用方法如下:

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(updateCaption()));
timer->start(1000);
QTimer
对象被制作成此小部件的子对象,以便 此小部件被删除,计时器也被删除。接下来,它的
timeout()
信号被连接到将进行工作的插槽,它被启动 值为1000毫秒,表示将超时 每一秒

<>在C++中,计时器对小部件或另一个代码> QObjult<代码>进行了表示,然后它们的寿命与QObjult/Cuth>的寿命相关,但是在不需要时停止一个定时器仍然是一个很好的实践。当您调用
setLayout
时,布局将成为父级。计时器不知道它的父对象,因此当小部件被销毁时,它不会被销毁。它只是位于堆上,仍然由
QApplication
事件循环运行

因此,要么将self传递给
QTimer
的构造函数,要么调用
QTimer
上的
setParent
将其正确设置到对象树中

更新:显然,
setParent
在PyQt中不起作用。只需在
QTimer
构造函数中传入
self

希望有帮助。

计时器功能的主要API是
QTimer
。那个班 提供定时定时器,在定时器触发时发出信号,以及 继承
QObject
,使其与 大多数GUI程序。通常的使用方法如下:

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(updateCaption()));
timer->start(1000);
QTimer
对象被制作成此小部件的子对象,以便 此小部件被删除,计时器也被删除。接下来,它的
timeout()
信号被连接到将进行工作的插槽,它被启动 值为1000毫秒,表示将超时 每一秒

<>在C++中,计时器对小部件或另一个代码> QObjult<代码>进行了表示,然后它们的寿命与QObjult/Cuth>的寿命相关,但是在不需要时停止一个定时器仍然是一个很好的实践。当您调用时,布局将成为父级<