如何在 while 循环中更新 QLabel

How to update QLabel in while loop

感觉我应该能够设置一个事件侦听器来运行一个 AJAX 类似的调用来更新 qlabel 但这似乎对 QT 来说是无穷无尽的复杂。

基本上我想做的是更新 QLabel 中的文本。这发生在一个无限循环上,该循环在单击按钮时中断(又名类似于包含标志的插槽)。这样做的原因是我实际上是在即时读取由用户更新的文本文件。当用户保存文本文件时,QLabel 上的内容会更新。当用户对他们点击 "send" 的文本感到满意时。然后它会杀死监听器并将文本内容通过电子邮件发送到预定义的电子邮件地址。这是与工作相关的,所以用户故事已经发生了很大的变化,但总体概念是我想要的。

我尝试做一些事情,比如设置一个标志,并通过执行以下操作来监听:

    while not self.flag_set:
        self.my_text = text_read_module.get_text(self)
        self.label_60.setText(self.my_text)
        QCoreApplication.processEvents()
        sleep(2)

我也试过将它推入它自己的进程并在调用包含终止信号的按钮时终止

它们都无法在屏幕上显示任何内容,但我可以告诉它们 运行 感谢一些方便的花花公子打印语句

PS 这是在 Python 中完成的,但希望它很容易为 C++ 用户准备好

知道如何让它工作吗?谢谢!

Qt/PyQt中,触发回调的方法是Signal/Slot系统。通常,如果您需要连续执行某些操作,并且偶尔会根据该操作更新 GUI,您会创建一个工作线程,使用 Signals 将更新发送回主线程。例如,您可以创建一个连续检查文件更新的工作线程,当它检测到更改时,它可以使用信号将数据发送回主线程。您的主线程 GUI 将侦听该信号并相应地更新 GUI。

幸运的是,在您的情况下,Qt 已经有一个名为 QFileSystemWatcher 的 class,因此您无需手动创建带有信号的单独线程。

class MyWidget(QtGui.QWidget):

    def __init__(self):
        super(MyWidget, self).__init__()
        self.label = QtGui.QLabel(self)
        self.watcher = QtCore.QFileSystemWatcher(self)
        self.watcher.addPath('/path/to/file')
        self.watcher.fileChanged.connect(self.updateLabel)

    def updateLabel(self, path):
        with open(path, 'r') as f:
            self.label.setText(f.read())