日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

PyQt5學習之QThread類的使用詳解_python

作者:SongYuLong的博客 ? 更新時間: 2022-12-28 編程語言

PyQt5 QThread

QThread是Qt線程類中最核心的底層類。要使用QThrea開始一個線程,可以創建它的一個子類,然后覆蓋其QThread.run()函數。

class Thread(QThread):
def _init_(self):
super(Thread, self)._init_()
def run(self):
# 線程相關代碼
pass
thread = Thread()
thread.start()

import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt

class MainWidget(QWidget):
    def __init__(self, parent=None):
        super(MainWidget, self).__init__(parent)
        self.setWindowTitle("QThread Demo")
        self.thread = Worker()
        self.listFile = QListWidget()
        self.btnStart = QPushButton("開始")
        layout = QGridLayout(self)
        layout.addWidget(self.listFile, 0, 0, 1, 2)
        layout.addWidget(self.btnStart, 1, 1)
        self.btnStart.clicked.connect(self.slotStart)
        self.thread.sinOut.connect(self.slotAdd)

    def slotAdd(self, file_info):
        self.listFile.addItem(file_info)

    def slotStart(self):
        self.btnStart.setEnabled(False)
        self.thread.start()



class Worker(QThread):
    sinOut = pyqtSignal(str)
    def __init__(self, parent=None):
        super(Worker, self).__init__(parent)
        self.working = True
        self.num = 0

    def __del__(self):
        self.working = False
        self.wait()

    def run(self):
        while self.working == True:
            file_str = 'File index {0}'.format(self.num)
            self.num += 1
            self.sinOut.emit(file_str)
            self.sleep(2)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MainWidget()
    win.show()
    sys.exit(app.exec_())

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
    
global sec
sec=0

class WorkThread(QThread):
	trigger = pyqtSignal()
	def __int__(self):
		super(WorkThread,self).__init__()

	def run(self):
		for i in range(10000000):
			pass
		
		# 循環完畢后發出信號		
		self.trigger.emit()        

def countTime():
	global  sec
	sec += 1
	# LED顯示數字+1
	lcdNumber.display(sec)          

def work():
	# 計時器每秒計數
	timer.start(1000)   
	# 計時開始	
	workThread.start()       
	# 當獲得循環完畢的信號時,停止計數	
	workThread.trigger.connect(timeStop)  

def timeStop():
	timer.stop()
	print("運行結束用時",lcdNumber.value())
	global sec
	sec=0

if __name__ == "__main__":  	
	app = QApplication(sys.argv) 
	top = QWidget()
	top.resize(300,120)
    
	# 垂直布局類QVBoxLayout
	layout = QVBoxLayout(top) 
    # 加個顯示屏    
	lcdNumber = QLCDNumber()             
	layout.addWidget(lcdNumber)
	button = QPushButton("測試")
	layout.addWidget(button)

	timer = QTimer()
	workThread = WorkThread()

	button.clicked.connect(work)
    # 每次計時結束,觸發 countTime
	timer.timeout.connect(countTime)      

	top.show()
	sys.exit(app.exec_())

事件處理processEvents

在耗時程序時不斷調用QApplication.processEvents()就可以實現一邊執行耗時程序,一邊刷新UI頁面的功能。

import sys
import time
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication, QListWidget, QGridLayout

class WinForm(QWidget):

    def __init__(self, parent=None):
        super(WinForm, self).__init__(parent)
        self.setWindowTitle("實時刷新頁面Demo")
        self.listFile = QListWidget()
        self.btnStart = QPushButton('開始')
        layout = QGridLayout(self)
        layout.addWidget(self.listFile, 0, 0, 1, 2)
        layout.addWidget(self.btnStart, 1, 1)
        self.btnStart.clicked.connect(self.slotAdd)
        self.setLayout(layout)

    def slotAdd(self):
        for n in range(10):
            str_n = 'File index {0}'.format(n)
            self.listFile.addItem(str_n)
            QApplication.processEvents()
            time.sleep(1)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = WinForm()
    win.show()
    sys.exit(app.exec_())

原文鏈接:https://blog.csdn.net/songyulong8888/article/details/128044091

欄目分類
最近更新