是什么在MacOs下使用pygt5或pyside2的简单QTimer示例中导致这种怪异的UI行为?

问题描述

我是PyQt5的新手。我从互联网上复制了一个简单的QTimer示例。确实可以,但是我得到了怪异的伪像,并且按钮禁用/启用功能无法正常工作。我尝试了一些简单的更改,但问题仍然存在。我不知道这是对执行模型的基本缺乏了解,还是PyQt5中的错误。使用pyside2可以得到完全相同的怪异效果。这是代码

import sys
from pyside2.QtWidgets import *
# from PyQt5.QtWidgets import *
from pyside2.QtCore import QTimer,QDateTime
# from PyQt5.QtCore import QTimer,QDateTime

class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setwindowTitle('QTimer example')

        self.listFile=QListWidget()
        self.label=QLabel('Label')
        self.startBtn=QPushButton('Start')
        self.endBtn=QPushButton('Stop')

        widget = QWidget()
        vlayout = QVBoxLayout()
        hlayout = QHBoxLayout()

        self.running = False
        self.endBtn.setEnabled(False)
        self.timer=QTimer()
        self.timer.timeout.connect(self.showTime)

        hlayout.addWidget(self.startBtn)
        hlayout.addWidget(self.endBtn)
        vlayout.addWidget(self.label)
        vlayout.addLayout(hlayout)

        self.startBtn.clicked.connect(self.start_timer)
        self.endBtn.clicked.connect(self.endTimer)

        widget.setLayout(vlayout)
        self.setCentralWidget(widget)

    def showTime(self):
        time=QDateTime.currentDateTime()
        timedisplay=time.toString('yyyy-MM-dd hh:mm:ss dddd')
        self.label.setText(timedisplay)


    def start_timer(self):
        self.startBtn.setEnabled(False)
        self.endBtn.setEnabled(True)
        self.timer.start(1000)

    def endTimer(self):
        self.startBtn.setEnabled(True)
        self.endBtn.setEnabled(False)
        self.timer.stop()

if __name__ == '__main__':
    app=QApplication(sys.argv)
    form=Window()
    form.show()
    sys.exit(app.exec_())

我在互联网上看到一些有关仅限于MacOS的类似问题的文章,并谈到降级PyQt5,这是我尝试pyside2的原因之一

除了按钮禁用功能无法完全正常工作外,我还看到了以下视觉效果

enter image description here

以下是相关版本:

Mac OS Catalina,Python 3.7,pyqt5 5.12.3,pyside2 5.13.2

解决方法

事实证明,这是PyQt5中Mac特定错误的另一个示例,如此处所述:

PyQt widget refresh behavior different when clicking button with mouse or keyboard

在代码中添加重绘调用可解决此问题。

令人担忧的是,这个明显的错误尚未修复,这让我想知道MacOS上的pyq5 ....