2016-05-31 141 views
0

感觉就像我应该能够建立一个事件监听器来运行AJAX调用来更新qlabel,但这似乎与QT无限复杂。如何更新while循环中的QLabel

基本上我试图做的是更新QLabel中的文本。这发生在单击按钮时出现的无限循环(类似于包含标志的插槽)。原因是我本质上是在用户更新的文本文件中读取。当用户保存文本文件时,内容会在QLabel上更新。当用户对文本感到满意时,他们点击“发送”。然后杀死听众和电子邮件将文本内容转换为预定义的电子邮件地址。这是与工作相关的,所以用户故事已经发生了很大的变化,但总体概念正是我所要做的。

我试图做类似设置一个标志,该监听通过执行以下操作:

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++用户做好准备

任何想法如何得到这个工作?谢谢!

+0

在主事件循环中调用'processEvents'的用例很少,并且从主线程调用'sleep'通常是一个坏主意。不要一直检查需要设置的文本,而要使用信号/插槽组合。 –

+0

我通常不是睡眠的支持者,我只是将它用作停止间隙,所以它不会每秒运行100次以上。我肯定喜欢使用信号/插槽组合,我该怎么做这个用户故事? –

+0

你没有'text_read_module'发出信号吗?它是否是非Qt库的一部分? –

回答

4

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

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

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()) 
+0

谢谢,这正是我要去的! –