Можно ли остановить таймер
QTimer.singleShot()
? (Пожалуйста, не говорите мне использовать функциюstop()
объектаQTimer
— я действительно хочу знать, можно ли остановить статическую функциюQTimer.singleShot()
до истечения ее времени)Что произойдет, если второй
QTimer.singleShot()
будет запущен до того, как истечет первый? Первый убит или вместо него запускается второй?
Остановить таймер QTimer.singleShot()
Ответы (1)
Q. Что произойдет, если второй QTimer.singleShot() будет запущен до того, как истечет первый? Первый убит или вместо него запускается второй?
- Все таймеры работают независимо, поэтому, если два из них запущены последовательно, оба будут работать до завершения.
В. Можно ли остановить таймер QTimer.singleShot()? (Пожалуйста, не говорите мне использовать функцию stop() объекта QTimer - я действительно хочу знать, можно ли остановить статическую функцию 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_())