QTimer与timeout-method的连接在TestCases(Python)中不起作用

时间:2015-02-10 13:17:10

标签: python qt timer pyqt testcase

我刚刚完成了一个软件,想在python' TestCase的帮助下进行测试。方法test_show_video应该开始QTimer。它连接到test_run_iteration,它每0.1秒向上汇总一个索引。在调用assert之前,该方法有三秒的时间来总结索引,因此它应该大于零。但事实并非如此。有人有线索吗?实际上,与计时器的超时连接似乎是错误的。

try:
    app = QtGui.QApplication(sys.argv)
except RuntimeError:
    app = QtCore.QCoreApplication.instance()

class TestProgressPresenter(TestCase):

    def test_show_video(self):

        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.test_run_iteration)
        self.timer.start(100)
        self.index = 0

        millis = start_time = int(round(time.time() * 1000))

        while start_time + 3000 > millis:
            millis = int(round(time.time() * 1000))

        assert self.index > 0

    def test_run_iteration(self):
        self.index += 1

1 个答案:

答案 0 :(得分:3)

这里你在while循环期间阻止Qt事件循环3秒。实际上,在控制权返回到事件循环之前,不会调用计时器的timeout信号,并且当完成时间并且test_show_video完成时,不会调用此计时器。

如果您希望定时器被触发,您应该确保在while循环检查期间处理事件。为此你可以有一些东西:

while start_time + 3000 > millis:
    millis = int(round(time.time() * 1000))
    QApplication.processEvents(QEventLoop.AllEvents)

使用本地事件循环等待几秒钟会更容易:

self.loop = QtCore.QEventLoop()
QTimer.singleShot(3000, loop.quit)
loop.exec()

assert self.index > 0