2016-05-31 5 views
0

Похоже, что я должен просто настроить прослушиватель событий, который запускает вызов AJAX, чтобы обновить qlabel, но это, похоже, бесконечно сложно с QT.Как обновить QLabel во время цикла

В основном, я пытаюсь обновить текст в QLabel. Это происходит в бесконечном цикле, который ломается при нажатии кнопки (AKA - это как слот, содержащий флаг). Причина этого заключается в том, что я по существу читаю текстовый файл «на лету», который обновляется пользователем. Когда пользователь сохраняет текстовый файл, обновления содержимого в QLabel. Когда пользователь доволен текстом, он нажимает «отправить». Затем он убивает слушателя и E-Mails текстового содержимого на заранее определенный адрес электронной почты. Это связано с работой, поэтому пользовательская история была значительно изменена, но общая концепция - это то, что я собираюсь сделать.

Я пытался делать что-то вроде установки флага и это прослушивание, выполнив следующие действия:

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 метод запуска обратных вызовов - это система сигналов/слотов. Как правило, если вам нужно постоянно выполнять некоторую операцию и иногда обновлять графический интерфейс на основе этой операции, вы должны создать рабочий поток, который отправляет обновления обратно в основной поток, используя Signals. Например, вы можете создать рабочий поток, который постоянно проверяет файл на наличие обновлений, и когда он обнаруживает изменение, он может отправить данные обратно в основной поток с помощью сигнала. Ваш основной поток 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

Спасибо, это именно то, что я собирался! –

Смежные вопросы