PyqQt 将代码中 QLabel/QPushButton 的颜色更改为红色(以显示 "Busy"-status)并在执行后再次返回

PyqQt Change Color of QLabel/QPushButton in code to red (to show "Busy"-status) and back again after execution

我正在编写一个使用 PyQt 调用某些外部函数的工具。 基本上,一些文件应该加载到 GUI 中,然后这些文件将通过一些 subprocess.run-command 发送到外部函数。 此功能需要很长时间才能 运行 完全完成,并且该工具在此期间将处于非活动状态。因此,我的目标是通过函数将 QLabel/QPushButton 的 color/icon/... 从“绿色”更改为“红色”,时间为 运行。函数调用完成后,我想将颜色改回“绿色”。因此,它应该模仿状态 lamp.

lamp = QtWidgets.QPushButton(self.centralwidget)
lamp.setStyleSheet("background-color: red")
# external function call
lamp.setStyleSheet("background-color: green")

但是,lamp 标签不会变红,除非外部函数调用包含诸如 QFileDialog 之类的内容或其他暂停程序执行的内容。

我也尝试使用调色板而不是样式 sheet。 我还尝试使用 PyQtSignals 解决问题 - 没有任何效果。

我还尝试使用

强制标签更新其颜色
lamp.style().unpolish(lamp);
lamp.style().polish(lamp);
lamp.update();

非常欢迎我提供解决方案!提前致谢!

我不确定这是不是你想要的。

但我认为你应该使用QThread来执行子进程。

给你QtThread的例子,你自己修改

或者您Google搜索QThread。

class YourQt:
    code...

    def example(self):
        self.lamp = QtWidgets.QPushButton(self.centralwidget)
        self.lamp.setStyleSheet("background-color: red")
        self.lamp_thread = LampThread()
        self.lamp_thread.lamp_signal .connect(self.example_finish)
        self.lamp_thread.start()

    def example_finish(self, signal):
        self.lamp.setStyleSheet("background-color: green")


class LampThread(QtCore.QThread):
    lamp_signal = QtCore.pyqtSignal(bool)

    def __init__(self):
        super(LampThread, self).__init__()

    def run(self):
        # subprocess.run-command
        self.lamp_signal.emit(True)