說(shuō)Qt只是個(gè)圖形庫(kù)的人,終究還是太年輕了,雖然以前我也說(shuō)過(guò)這樣的話。
Qt中的線程可以在后臺(tái)偷偷摸摸地做一些看不見的事情,比如處理網(wǎng)絡(luò)連接,或者修改UI。用法也比較簡(jiǎn)單,最常見的是直接繼承。
import time # 為了制造延遲效果
from PyQt5 import QtWidgets, QtCore
# 老三樣,創(chuàng)建一個(gè)應(yīng)用窗口
app = QtWidgets.QApplication([])
dlg = QtWidgets.QDialog()
dlg.show()
class MyThread(QtCore.QThread):
''' 繼承QThread類,并重寫run方法。run方法里面是我們?nèi)鰵g的地方。 '''
def run(self):
time.sleep(1) # 設(shè)置一秒鐘后,改標(biāo)題
dlg.setWindowTitle('hahahaha')
thread = MyThread()
thread.start()
app.exec_()
如果不方便繼承,可以用types模塊將外部函數(shù)添加到線程中:
import time
from PyQt5 import QtWidgets, QtCore
app = QtWidgets.QApplication([])
dlg = QtWidgets.QDialog()
dlg.show()
def changeTitle(self):
# 注意這有個(gè) self, 跟一般的類函數(shù)寫法是一樣的
# 我們要假裝這個(gè)函數(shù)就是thread中的函數(shù)
time.sleep(1)
dlg.setWindowTitle('hehehehe')
thread = QtCore.QThread()
#thread.run = changeTitle # 這種方法是行不通的, 要用下面那種
import types
thread.run = types.MethodType(changeTitle, thread) # 把外部函數(shù)強(qiáng)加給線程
thread.start()
app.exec_()
文中的代碼直接復(fù)制粘貼運(yùn)行就能看到效果。