簡介
QThread
類提供了一種獨立於平臺的執行緒管理方法。
QThread
物件管理程式中的一個控制執行緒。在run()
中開始執行QThreads
。預設情況下,run()
透過呼叫exec()
啟動事件迴圈,並線上程中執行Qt
事件迴圈。
建立一個新執行緒
class Thread(QThread):
def __init__(self):
super().__init__()
def run(self):
# 執行緒相關程式碼
pass
# 建立一個新的執行緒
thread = Thread()
thread.start()
在使用執行緒時可以直接得到Thread
例項,呼叫其start()
函式即可啟動執行緒,執行緒啟動後,會呼叫其實現的run
方法,該方法就是執行緒的執行函式,當run()
退出之後執行緒基本就結束了。
QThread中常用的方法
例子實現
下面的例子透過在QThread
中定義兩個自定義訊號實現時間的變化和動態為QListWidget
新增控制元件
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Created on 2019年1月16日
@author: yiluo
@site: https://github.com/bingshilei
@email: 786129166@qq.com
@file: QThreadDemo2
@description: 使用多執行緒動態新增控制元件
"""
import time
from PyQt5.QtCore import QThread, pyqtSignal, QDateTime
from PyQt5.QtWidgets import QWidget, QLineEdit, QListWidget, QPushButton,\
QVBoxLayout, QLabel
'''
宣告執行緒類
'''
class addItemThread(QThread):
add_item = pyqtSignal(str)
show_time = pyqtSignal(str)
'''
新增控制元件
'''
def __init__(self,*args, **kwargs):
super(addItemThread, self).__init__(*args, **kwargs)
self.num = 0
def run(self, *args, **kwargs):
while True:
file_str = 'File index{0}'.format(self.num,*args, **kwargs)
self.num +=1
#傳送新增訊號
self.add_item.emit(file_str)
date = QDateTime.currentDateTime()
currtime = date.toString('yyyy-MM-dd hh:mm:ss')
print(currtime)
self.show_time.emit(str(currtime))
time.sleep(1)
class Window(QWidget):
def __init__(self, *args, **kwargs):
super(Window, self).__init__(*args, **kwargs)
self.setWindowTitle('多執行緒動態新增控制元件')
# x,y,w,h
self.setGeometry(800, 100, 500, 750)
#建立QListWidget控制元件
self.listWidget = QListWidget()
#建立按鈕控制元件
self.btn = QPushButton('開始',self)
self.lb = QLabel('顯示時間',self)
#建立佈局控制元件
self.vlayout = QVBoxLayout()
#將按鈕和列表控制元件新增到佈局
self.vlayout.addWidget(self.btn)
self.vlayout.addWidget(self.lb)
self.vlayout.addWidget(self.listWidget)
#設定窗體的佈局
self.setLayout(self.vlayout)
#繫結按鈕槽函式
self.btn.clicked.connect(self.startThread)
#宣告執行緒例項
self.additemthread = addItemThread()
#繫結增加控制元件函式
self.additemthread.add_item.connect(self.addItem)
#繫結顯示時間函式
self.additemthread.show_time.connect(self.showTime)
'''
@description:按鈕開始,啟動執行緒
'''
def startThread(self):
#按鈕不可用
self.btn.setEnabled(False)
#啟動執行緒
self.additemthread.start()
'''
@description:為listwidget增加項
@param:項的值
'''
def addItem(self,file_str):
self.listWidget.addItem(file_str)
'''
@description:顯示時間
@param:項的值
'''
def showTime(self,time):
self.lb.setText(time)
if __name__ == '__main__':
import sys
from PyQt5.QtWidgets import QApplication
app = QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())
執行結果
點選開始按鈕,時間會進行變化,且在下方為QListWidget
不斷增加項
以上,就是自定義訊號和QThread
的運用。
謝謝您寶貴時間觀看。
作者:賣火柴的小小噴泉
連結:https://www.jianshu.com/p/18d7b119edcc
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
本作品採用《CC 協議》,轉載必須註明作者和本文連結