直接从Qthread PyQt 5更改GUI
嗨,我已经发送到GUI的线程工作程序链接,并直接从QThread更新GUI信息。像这儿:
class Worker(QThread):
def __init__(self, ui):
QThread.__init__(self)
self.running = False
self.ui = ui
def run(self):
self.running = True
while self.running:
info = self.check_info()
rows = len(info)
self.ui.tableWidget.setRowCount(rows)
self.ui.tableWidget.setColumnCount(6)
...
在主要QMainWindow
我只是添加
def __init__(self, parent=None):
.......
self.myworker = Worker(self.ui)
.....
这样的解决方案在PyQt5中非常不好吗?我是PyQt的新手。谢谢。如果我的解决方案不好,请帮助我修复它。
-
您不能也不能从辅助线程更新GUI,必须通过信号和插槽来完成:
为此
pyqtSignal()
,我们将通过class创建一个信号,并将指示参数的类型,然后将其连接到所需的插槽,如下所示:线:
class Worker(QThread): list_of_dict_signals = pyqtSignal(list) str_signal = pyqtSignal(str) def __init__(self, parent=None): QThread.__init__(self, parent) self.running = False def run(self): self.running = True while self.running: info = self.check_info() self.list_of_dict_signals.emit(info) self.str_signal.emit("Requesting info")
界面:
def __init__(self, parent=None): ....... self.myworker = Worker(self) self.myworker.list_of_dict_signals.connect(self.onDataFromThread) self.myworker.str_signal.connect(self.ui.statusbar.showMessage) self.myworker.start() def onDataFromThread(self, info): rows = len(info) self.ui.tableWidget.setRowCount(rows) ...