Отменить все выдающиеся события QTimer - PullRequest
7 голосов
/ 22 февраля 2011

Я ищу способ настроить количество синхронизированных вызовов функций в pyqt, чтобы отменить все ожидающие вызовы, когда это необходимо.

Я искал использование QtCore.QTimer для настройки вызовов функций., но я не знаю ни одного хорошего способа отменить эти звонки.Есть идеи?

Я не могу найти какой-либо способ отменить после использования QtCore.QTimer.singleShot(1000, self.function).Если вместо этого я создаю список QTimer объектов, я могу их остановить, но затем я вынужден управлять списком объектов таймера (создание, удаление, которые активны и т. Д.), Которых я хотел бы избежать.

# Setup a timer object.
timer = QtCore.QTimer(self)
timer.timeout.connect(self.function)
timer.setSingleShot(True)
timer.start(1000)

# To stop the timer object at some later point.
timer.stop()

Я мог бы также управлять своей собственной очередью ожидающих вызовов функций, которую я также хотел бы избежать, если это возможно (для простоты).

Вот некоторый фиктивный код, показывающий, что я пытаюсь сделать:

import sys
from PyQt4 import QtCore

class Test(QtCore.QObject):

    def __init__(self, parent=None):
        QtCore.QObject.__init__(self, parent)


    def addDelayedCall(self, time, function):
        # Do something here.
        pass


    def clearPendingCalls(self):
        print('  Clearing pending function calls.')
        # Do something here.


    def setupCalls(self):
        self.addDelayedCall(500, self.dummy)
        self.addDelayedCall(1000, self.dummy)
        self.addDelayedCall(1500, self.dummy)
        self.addDelayedCall(2000, self.dummy)


    def dummy(self):
        print('dummy just got called.')


if __name__ == '__main__':
    app = QtCore.QCoreApplication(sys.argv)
    test = Test(app)

    QtCore.QTimer.singleShot(0, test.setupCalls)
    QtCore.QTimer.singleShot(1250, test.clearPendingCalls)

    QtCore.QTimer.singleShot(5000, app.quit)            
    sys.exit(app.exec_())

Ответы [ 2 ]

4 голосов
/ 22 февраля 2011

Я предложил решение, используя функции таймера, предоставленные QObject.Я подозреваю, что есть более элегантное решение, но это, вероятно, будет работать для того, что мне нужно.

import sys
from PyQt4 import QtCore


class Test(QtCore.QObject):

    def __init__(self, parent=None):
        QtCore.QObject.__init__(self, parent)

        self.timers = {}


    def timerEvent(self, event):
        function = self.timers.pop(event.timerId())
        self.killTimer(event.timerId())
        function()


    def addDelayedCall(self, time, function):
        timer_id = self.startTimer(time)

        self.timers[timer_id] = function


    def clearPendingCalls(self):
        print('  Clearing pending function calls.')

        while self.timers:
            timer_id, function = self.timers.popitem()
            self.killTimer(timer_id)


    def setupCalls(self):
        self.addDelayedCall(500, self.dummy)
        self.addDelayedCall(1000, self.dummy)
        self.addDelayedCall(1500, self.dummy)
        self.addDelayedCall(2000, self.dummy)


    def dummy(self):
        print('dummy just got called.')




if __name__ == '__main__':
    app = QtCore.QCoreApplication(sys.argv)
    test = Test(app)

    QtCore.QTimer.singleShot(0, test.setupCalls)
    QtCore.QTimer.singleShot(1250, test.clearPendingCalls)

    QtCore.QTimer.singleShot(5000, app.quit)            
    sys.exit(app.exec_())
2 голосов
/ 22 февраля 2011

вы можете отключить от сигнала таймера и снова подключиться, когда вам нужно. После отключения вы прекращаете принимать любые звонки от таймера, даже если он все еще остается активным. Ниже приведен небольшой пример:

import sys
from PyQt4 import QtGui, QtCore

class MainForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainForm, self).__init__(parent)

        self.button = QtGui.QPushButton("button", self)       
        self.button.resize(100, 30)

        self.connect(self.button, QtCore.SIGNAL('clicked()'), self.on_button_click)

        self.connected = True
        self.timer = QtCore.QTimer(self)
        self.connect(self.timer, QtCore.SIGNAL('timeout()'), self.on_timeout)
        self.connect(self.timer, QtCore.SIGNAL('timeout()'), self.on_timeout_test)
        self.timer.start(1000)

    def on_button_click(self):
        if self.connected:
            self.disconnect(self.timer, QtCore.SIGNAL('timeout()'), self.on_timeout_test)
        else:
            self.connect(self.timer, QtCore.SIGNAL('timeout()'), self.on_timeout_test)
        self.connected = not self.connected

    def on_timeout(self):
        print 'on_timeout'

    def on_timeout_test(self):
        print 'on_timeout_test'

def main():
    app = QtGui.QApplication(sys.argv)
    form = MainForm()
    form.show()
    app.exec_()

if __name__ == '__main__':
    main()

после запуска таймера оба слота on_timeout и on_timeout_test вызывают, когда вы нажимаете кнопку , слот on_timeout_test отключается, а затем снова подключается, если нажата кнопка еще раз.

надеюсь, это поможет, с уважением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...