Остановить таймер QTimer.singleShot()

  1. Можно ли остановить таймер QTimer.singleShot()? (Пожалуйста, не говорите мне использовать функцию stop() объекта QTimer — я действительно хочу знать, можно ли остановить статическую функцию QTimer.singleShot() до истечения ее времени)

  2. Что произойдет, если второй QTimer.singleShot() будет запущен до того, как истечет первый? Первый убит или вместо него запускается второй?


person Hamza Hmidi    schedule 24.12.2016    source источник
comment
Вы Геерт Ванкомпернолле, и я требую свои 5 евро.   -  person ekhumoro    schedule 24.12.2016
comment
Возможный дубликат Как я могу убить один выстрел QtCore.QTimer в PyQt4?   -  person three_pineapples    schedule 25.12.2016
comment
@three_pineapples. Это не дает окончательного ответа на вопрос об остановке однократных таймеров, запущенных с помощью статической функции.   -  person ekhumoro    schedule 26.12.2016


Ответы (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_())
    
person ekhumoro    schedule 26.12.2016