是否可以停止QTimer.singleShot()
计时器? (请不要告诉
我使用stop()
对象的QTimer
函数 - 我真的很想
知道之前是否可以停止静态函数QTimer.singleShot()
它的时间已经过去了)
如果在第二个QTimer.singleShot()
之前启动,会发生什么?
第一个过去了吗?第一个被杀,还是第二个被杀
开始了吗?
答案 0 :(得分:0)
Q值。如果第二个QTimer.singleShot()在之前启动会发生什么 第一个过去了吗?是第一个被杀或是第二个 开始了吗?
Q值。是否可以停止QTimer.singleShot()计时器? (请不要告诉 我使用QTimer对象的stop()函数 - 我真的很想 知道静态函数QTimer.singleShot()是否可以在之前停止 它的时间已经过去了)
静态函数创建一个处理计时器的内部对象,因此没有可用于停止它的公共API。但是,有一个涉及QAbstractEventDispatcher
的黑客可以解决这个限制。它依赖于实现细节,因此不建议在生产代码中使用它。但你问它是否可能,所以这是一个演示:
from PyQt4 import QtCore, QtGui
class Window(QtGui.QWidget):
def __init__(self):
super(Window, self).__init__()
self.button = QtGui.QPushButton('Start', self)
self.button.clicked.connect(self.handleTimer)
self.edit = QtGui.QLineEdit(self)
self.edit.setReadOnly(True)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.button)
layout.addWidget(self.edit)
self._timer = None
def handleTimer(self):
dispatcher = QtCore.QAbstractEventDispatcher.instance()
if self._timer is None:
self.edit.clear()
self.button.setText('Stop')
QtCore.QTimer.singleShot(3000, self.handleTimeout)
self._timer = dispatcher.children()[-1]
else:
dispatcher = QtCore.QAbstractEventDispatcher.instance()
dispatcher.unregisterTimers(self._timer)
self.button.setText('Start')
self._timer = None
def handleTimeout(self):
self._timer = None
self.button.setText('Start')
self.edit.setText('timeout')
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.setGeometry(500, 150, 300, 100)
window.show()
sys.exit(app.exec_())