因此,在我的应用程序中,我创建了一个QtCore.QTimer对象,然后在该对象上调用singleShot方法以在60秒后调用一个函数。现在,在任何给定时间点,如果我需要再次在其上调用singleShot方法,并阻止先前的singleShot方法生效(即阻止它调用传递给它的调用者,如果第二次singleShot是在前60秒之前调用),我该怎么办?如何才能“杀死”以前的QTimer并完全忘记它,而只能使用当前的QTimer

有人可以帮我这个忙吗?

这只是一个示例代码:

def main():
    q = QtCore.QTimer()
    q.singleShot(4000, print_hello)
    q.killTimer(id)     ##how can I get the value of 'id' so that print_hello() is not called before the end of the 4 seconds?

def print_hello():
    print 'hello'

谢谢

最佳答案

问题是QTimer.singleShot()不返回对QTimer的引用。无论如何,我不知道如何获取计时器ID,因此您可以使用该方法将其杀死。但是,您可以实例化一个正常的QTimer并将其设置为单次计时器(这不是您在提供的代码中所做的事情,在singleShot实例上调用QTimer会创建一个新的 QTimer,您无法访问它。 )

但是,一切并没有丢失。您可以创建一个普通的QTimer,并使用setSingleShot(True)将其转换为单次计时器。如果您希望中止计时器,则可以调用stop()方法。请参阅下面的代码示例,该示例在3秒钟的超时时间内完成了您需要的工作。您可以连续快速按任意多次按钮,并在停止后3秒钟打印一次“hello”。如果按下一次,请等待4秒钟,然后再次按下,它当然会打印两次!

希望对您有所帮助!

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *


class MyApp(QWidget):
    def __init__(self,*args,**kwargs):
        QWidget.__init__(self,*args,**kwargs)
        self.current_timer = None
        self.layout = QVBoxLayout(self)
        self.button = QPushButton('start timer')
        self.button.clicked.connect(self.start_timer)
        self.layout.addWidget(self.button)

    def start_timer(self):
        if self.current_timer:
            self.current_timer.stop()
            self.current_timer.deleteLater()
        self.current_timer = QTimer()
        self.current_timer.timeout.connect(self.print_hello)
        self.current_timer.setSingleShot(True)
        self.current_timer.start(3000)

    def print_hello(self):
        print 'hello'


# Create QApplication and QWidget
qapp = QApplication(sys.argv)
app = MyApp()
app.show()
qapp.exec_()

关于python - 如何在PyQt4中杀死QtCore.QTimer一枪?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21079941/

10-12 02:52