除非主窗口未聚焦,否则不会更新 QLabel

Posted

技术标签:

【中文标题】除非主窗口未聚焦,否则不会更新 QLabel【英文标题】:QLabel is not updated unless the mainWindow is unfocused 【发布时间】:2019-12-21 16:25:23 【问题描述】:

我正在尝试将 PyQt5 与 Python 3.7.3 和 macOS 10.14.6 一起使用“Hello World”。执行下面的pyqt_helloworld.py 并单击按钮将标签更新为“Hello World”。

但是,当按钮被点击时,文本并没有改变,直到我手动关注其他应用程序的窗口,标签才被更新。如何在不分散 PyQt 应用程序焦点的情况下更新 QLabel?

提前致谢!

pyqt_helloworld_ui.py

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_HelloWorld(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(400, 300)
        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(70, 40, 201, 21))
        self.label.setObjectName("label")
        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(130, 90, 113, 32))
        self.pushButton.setObjectName("pushButton")

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.label.setText(_translate("Dialog", "foobar"))
        self.pushButton.setText(_translate("Dialog", "Click"))

pyqt_helloworld.py

import sys

from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QMainWindow

from pyqt_helloworld_ui import Ui_HelloWorld


class HelloWorldGui(QMainWindow, Ui_HelloWorld):
    def __init__(self, parent=None):
        super(HelloWorldGui, self).__init__(parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.setTextHelloWorld)

    def setTextHelloWorld(self):
        self.label.setText("Hello World")


if __name__ == '__main__':
    argvs = sys.argv
    app = QApplication(argvs)
    hello_world_gui = HelloWorldGui()
    hello_world_gui.show()
    sys.exit(app.exec_())

【问题讨论】:

即使出现错误也能正常工作:将QMainWindow改为QDialog。您使用的是最新版本的 PyQt5 吗?你的操作系统是什么?你的 Python 版本是多少?你是如何安装 PyQt5 的? 感谢您的评论。 - 我通过pip install PyQt5 安装了 PyQt5,它的版本是 5.13.0(最新) - 我使用的是 macOS 10.14.6。 - 在 pyqt_helloworld.py 中将 QMainWindow 更改为 QDialog 不起作用。 我认为这是一个错误,在具有 Python 3.7.4 和 PyQt5 5.13 的 Linux 中它可以正常工作,报告它。 抱歉我的回复晚了。我在 macOS Sierra 中尝试了上面的代码并确认它可以正常工作,所以这可能是 macOS 最近更新引起的问题。非常感谢您的帮助! 【参考方案1】:

自 5.11.0(测试 5.11.x、5.12.x 和 5.13)和 MacOS 上的 PySide2 v.5.13(测试 10.14 和 10.12.6)以来,PyQt5 中存在此问题。 v.5.10.1 工作正常。 Linux和Windows下不存在该问题 添加对 repaint 方法的调用可以解决此问题。

def setTextHelloWorld(self):
    self.label.setText("Hello World")
    self.label.repaint()

【讨论】:

以上是关于除非主窗口未聚焦,否则不会更新 QLabel的主要内容,如果未能解决你的问题,请参考以下文章

应用程序窗口未聚焦时如何在 UWP 中更改\控制鼠标位置?

Qt Window Focusing:关闭二级子窗口时主窗口不聚焦

除非我调整窗口大小,否则 QML 文本不会更新

单击时,WPF Popup不会导致应用程序被聚焦

未聚焦时Android隐藏FAB菜单

如何在 C# 中单击通知图标来聚焦模态对话框?