课程地址
github repo
,一个很简陋的记事本。我所使用的Python版本是Python 3.6.6
例子
,情看下面的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import sys
import tempfile
import subprocess
from PyQt5 import QtWidgets
from PyQt5.QtCore import QThread, pyqtSignal
from mainwindow import Ui_MainWindow
class CloneThread (QThread) :
signal = pyqtSignal('PyQt_PyObject' )
def __init__ (self) :
QThread.__init__(self)
self.git_url = ""
def run (self) :
tmpdir = tempfile.mkdtemp()
cmd = "git clone {0} {1}" .format(self.git_url, tmpdir)
subprocess.check_output(cmd.split())
self.signal.emit(tmpdir)
class ExampleApp (QtWidgets.QMainWindow, Ui_MainWindow) :
def __init__ (self, parent=None) :
super(ExampleApp, self).__init__(parent)
self.setupUi(self)
self.pushButton.setText("Git clone with Thread" )
self.pushButton.clicked.connect(self.git_clone)
self.git_thread = CloneThread()
self.git_thread.signal.connect(self.finished)
def git_clone (self) :
self.git_thread.git_url = self.lineEdit.text()
self.pushButton.setEnabled(False )
self.textEdit.setText("Started git clone operation." )
self.git_thread.start()
def finished (self, result) :
self.textEdit.setText("Cloned at {0}" .format(result))
self.pushButton.setEnabled(True )
def main () :
app = QtWidgets.QApplication(sys.argv)
form = ExampleApp()
form.show()
app.exec_()
if __name__ == '__main__' :
main()
这个代码的耗时任务是git clone,因此作者继承自QThread并实现了run方法,这里引用Qt官方文档对run()的描述:
void QThread::run()
The starting point for the thread. After calling
start
(), the newly created thread calls this function. The default implementation simply calls
exec
().
You can reimplement this function to facilitate advanced thread management. Returning from this method will end the execution of the thread.
See also
start
() and
wait
().
同时run的结尾有个emit,当任务执行完毕后将会发送一个信号,并把结果发送出去。
然后看ExampleApp的代码,实例化CloneThread后,把self.git_clone()和clicked事件连接起来,当按钮被clicked之后,就会通过新的线程执行git clone(调用CloneThread实例的start()方法),然后任务完毕把CloneThread实例发出的信号connect到self.finished()上,并作为run()所emit的内容作为finished()的参数执行收尾工作。
最后我们总结一下使用QThread的流程:
1.继承自QThread创建一个类,实现run方法,根据情况选择emit。
2.在GUI上监听事件,实例化步骤一的类,调用start()方法。
3.根据情况选择connect。
这里
看。希望读者看了这篇文章能有所帮助吧。
Qt牛逼!
####################################################################
再推荐一个YouTube大佬的PyQt5系列视频
教程