pyqt4 - 保持关闭按钮时QTimer停止

时间:2016-02-03 15:14:30

标签: python events pyqt4

我在pyqt4中编写一个应用程序,显示用户在主窗口上执行某些操作所需的剩余时间。我使用Qt5.5和pyqt4和python 2.7。

from PyQt4 import QtCore, QtGui


class MainWin(QtGui.QMainWindow):

    def __init__(self):
        super(MainWin, self).__init__()
        self.initUI()
        self.time = 120
        self.centralwidget = QtGui.QWidget(self)
        self.lcdNumber = QtGui.QLCDNumber(self.centralwidget)
        self.lcdNumber.setGeometry(QtCore.QRect(200, 170, 500, 550))
        self.displayTime()
        self.setCentralWidget(self.centralwidget)
        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.updateTime)
        self.timer.start(1000)

    def initUI(self):
        self.resize(1100, 850)
        # Do other stuff
    def displayTime(self):
        minute, sec = divmod(self.time,60)
        self.lcdNumber.display('{}:{:02d}'.format(minute,sec))
    def updateTime(self):
        self.time -= 1
        self.displayTime()
        if self.time == 0:
            self.timer.stop()

def main():
    import sys
    app = QtGui.QApplication(sys.argv)
    mw = MainWin()
    mw.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

这按照我的预期方式工作,但是当用户点击关闭按钮而不释放它时,他能够停止计时器,同时他仍然可以看到窗口上的内容。问题似乎只出现在Windows上。

1 个答案:

答案 0 :(得分:0)

根据这个Qt论坛帖子:

这是"正常" Windows上的行为。基本上,按住任何标题栏按钮会杀死所有事件处理,直到按钮被释放。

建议使用线程代替计时器。但在你的情况下,这可能不会有帮助,因为你需要发出信号来更新GUI,而跨线程信号也需要一个运行的事件循环。

所以也许您应该使用带有回调的pywin32 timer