pyqt5 如何在线程中更新窗口UI
总所周知窗口UI 和 程序中生成的子线程是不同的两个线程,如果在子线程中更新窗体UI 就会报错:
所以 需要解决这个问题,qt中有个叫信号的东西。可以通过信号(signal)来触发事件,传递消息
建立信号变量
//词句在窗内编写
signal_ListView_set= QtCore.pyqtSignal(str)
更新控件的函数
#线程更新ListView的工作函数
def update_listView(self,hosts_list):
slm = QStringListModel(); # 创建mode
self.qList.clear() # 重置清空列表
for host, status in hosts_list:
self.qList.append('{0}'.format(host, status))
print('{0}:{1}'.format(host, status))
slm.setStringList(self.qList) # 将数据设置到model
self.listView.setModel(slm) ##绑定 listView 和 model
绑定信号
self.signal_ListView_set.connect(self.update_listView) #绑定信号
在线程内发射信号执行槽函数。
#监控实时扫描的线程
def work_thread(self):
'''
:return:
'''
nm = nmap.PortScanner() # instantiate nmap.PortScanner object
nm.scan(hosts='192.168.1.0/24', arguments='-n -sP -PE -PA21,23,80,3389')
while True:
time.sleep(0.2) #每隔0.2秒查询一次
hosts_list = [(x, nm[x]['status']['state']) for x in nm.all_hosts()]
self.signal_ListView_set.emit(hosts_list)
if self.g_bExit == True:
break
结果