PySide6 多執行緒訊號傳遞

2022-10-09 02:15:14 字數 4705 閱讀 5156

本人是一位pyside的初學者,最近剛有點整明白pyside6的多執行緒間的訊號傳遞,於是想記錄一下。

之前在網上找資料時,感覺很多教程的**都比較複雜,於是想到寫乙個簡單版本的,也希望能給其他人一些參考。

由於本人也是初學者,因此可能有很多錯誤,也請大家不吝賜教。

這一步應該不用多講,如果看不懂建議從pyside基礎開始學起。

該執行緒主要就是倒數。我們要讓主程式的視窗上現實剩餘時間,就是hello!的那個位置。

class th(qthread):

timer = signal(int)

finish = signal(bool)

def __init__(self) -> none:

super().__init__()

def run(self):

# ptvsd.debug_this_thread()

print('start timer')

self.finish.emit(false)

for x in range(5):

self.timer.emit(5-x)

time.sleep(1)

self.finish.emit(true)

在這裡,我用signal初始化兩個訊號,用於傳遞剩餘時間和是否完成倒計時。

當倒計時開始時,設定未完成,將false給finish訊號:

self.finish.emit(false)

隨後每秒,都會把剩餘時間給timer訊號:

self.timer.emit(5-x)

當倒計結束時,將true給finish訊號:

self.finish.emit(true)

首先,我們點選click!按鈕應該開始倒計時,即執行我們上一步寫的執行緒。

@slot()

def fun(self):

self.th = th()

self.th.timer.connect(self.flushlabel)

self.th.finish.connect(self.isfinish)

self.th.start()

初始化執行緒,注意這裡要用類的成員變數,不要用區域性變數:

self.th = th()

之後是開始這個執行緒:

self.th.start()

self.th.timer.connect(self.flushlabel)

self.th.finish.connect(self.isfinish)

這兩個是完成訊號與槽的繫結。

timer和finish都是上一步我們在倒計時的類中設定的訊號。

我們希望,在th類(倒計時的類)中,每次訊號的emit,都會執行一次繫結的槽(self.flushlabel與self.isfinish)

上一步繫結的槽,在這裡我們來實現它。實現的**是在主視窗類中的。

class mainwindow(qwidget):

def __init__(self) -> none:

......

...@slot()

def fun(self):

......

...@slot(int)

def flushlabel(self,nu):

self.label.settext(str(nu))

@slot(bool)

def isfinish(self,bo):

if bo is true:

self.but.setenabled(true)

else:

self.but.setenabled(false)

@slot(int)@slot(bool)為標識槽函式的引數型別,不寫似乎也沒有問題。

def flushlabel(self,nu):

self.label.settext(str(nu))

這裡。該函式用來獲得timer每次emit的倒計時,將這個數字現實到主視窗的label中。

def isfinish(self,bo):

if bo is true:

self.but.setenabled(true)

else:

self.but.setenabled(false)

這個函式來獲得每次finish每次emit的狀態,判斷倒計時是否完成,用來控制主視窗的按鈕是否可以點選。

至此,我們的槽函式與訊號的繫結完成了。這樣每次在子執行緒(倒計時)的訊號被emit時,我們的主線程(主視窗)都能拿到其emit的內容,並且使用其內容對主視窗進行相應更改。

import sys,time

from pyside6.qtcore import signal,slot,qt,qthread

class mainwindow(qwidget):

def __init__(self) -> none:

super().__init__()

self.label = qlabel("hello!")

self.label.setalignment(qt.aligncenter)

self.but = qpushbutton("click!")

self.but.clicked.connect(self.fun)

self.layout = qvboxlayout()

self.layout.addwidget(self.label)

self.layout.addwidget(self.but)

self.setlayout(self.layout)

self.setwindowtitle('signal example')

self.resize(300,300)

self.show()

@slot()

def fun(self):

self.th = th()

self.th.timer.connect(self.flushlabel)

self.th.finish.connect(self.isfinish)

self.th.start()

@slot(int)

def flushlabel(self,nu):

self.label.settext(str(nu))

@slot(bool)

def isfinish(self,bo):

if bo is true:

self.but.setenabled(true)

else:

self.but.setenabled(false)

class th(qthread):

timer = signal(int)

finish = signal(bool)

def __init__(self) -> none:

super().__init__()

def run(self):

print('start timer')

self.finish.emit(false)

for x in range(5):

self.timer.emit(5-x)

time.sleep(1)

self.finish.emit(true)

if __name__ == '__main__':

widgets = mainwindow()

Qt 中多執行緒訊號傳遞 例項

qt 多執行緒的訊號傳遞 qobject connect const qobject sender,const char signal,const qobject receiver,const char method,qt connectiontype type autoconnection 這個函...

Qt 中多執行緒訊號傳遞 例項

2011 06 30 17 31 佚名 網際網路 字型大小 t t 本文介紹的是qt 中多執行緒訊號傳遞 例項,關於qt 中的多執行緒,相信友們接觸了不少,先來看本文介紹。ad qt 多執行緒的訊號傳遞 qobject connect const qobject sender,const char ...

PySide6教程之UI檔案的兩種使用方式

本頁面描述了如何使用qt creator為你的qt for python專案建立圖形介面。你需要qt creator來設計和修改你的介面 ui檔案 如果你不清楚如何使用qt creator,請參考使用qt designer文件 在qt creator中,建立乙個新的qt design form,選擇...