多线程是实现并发的一个重要手段。在GUI编程中,经常需要将耗费时间较多的任务分离出来成为一个线程,避免对主线程造成影响(造成界面无响应)。
在Qt中,最简单的多线程主要通过继承QThread类实现,重载虚函数run()。
1、一般我们先创建一个QThread子类,其中最主要的是run函数,当进程开始时会执行这个函数。
2、pyqtSignal()代表pyqt信号,我们在run的结束加一个结束退出信号。这个信号可以绑定connect一个函数,当结束时便会执行此函数。
注意:对于信号这个东西,emit也可以传递参数,如果想传递参数,那么绑定的函数也得有参数,并且pyqtSignal创建的时候也得带上参数类型。比如这里我们返回一个状态。
class DownloadThread(QThread):
trigger = pyqtSignal(str)
def __int__(self):
super(DownloadThread, self).__init__()
def set_port_url(self,port_default,url):
self.port_default = port_default
self.url = url
def run(self):
try:
# # 循环完毕后发出信号
self.trigger.emit("success!")
except Exception as e:
self.trigger.emit("fail!")
3、在pyqt界面中,我们会创建一个类,然后为它连接connect一个结束函数,并且通过set_val设定参数,最后start。
class win():
...
...
def download(self):
if self.ok:
self.content_tmp = self.content_tmp + "%s:Send the task to server\n" % (
time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
self.tmp.setText(self.content_tmp)
self.thread = DownloadThread()
self.thread.set_port_url(self.port_default,self.file_url.text()) # 创建
self.thread.trigger.connect(self.finish) # 连接信号
self.thread.start() # 开始线程
else:
reply = QMessageBox.question(self, 'Message',
"You should set port first", QMessageBox.Yes)
def finish(self,status):
if status == 'success!'
self.content_tmp = self.content_tmp + "%s:Finish!\n" % (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
self.tmp.setText(self.content_tmp)
else:
print('fali!')