pyqt5自定義訊號槽實現跨執行緒通訊

2021-10-24 04:43:32 字數 1891 閱讀 1796

self.log_box = qtextbrowser(

)def

job(self)

: output = os.popen(

'cd '

+ dir_path +

' && svn up '

+ dir_path)

# log_box新增日誌

self.log_box.settext(output.read())

self.scheduler = backgroundscheduler(

)self.scheduler.add_job(self.job,

'cron'

, day_of_week=week, hour=time.split(

':')[0

],minute=time.split(

':')[1

])self.scheduler.start(

)

backgroundscheduler定時器一旦啟動,程序將會在後台執行,不影響主線程,但是此時通過定時任務去操作qt模組,會失敗。job任務中,通過settext向qtextbrowser新增文字,會直接報錯,因為定時器和qt屬於不同執行緒。此時需要訊號槽來實現執行緒間通訊。

class

signaldef

(qobject)

: signal = pyqtsignal(

str)

訊號槽在建立的時候可以指定訊號型別,如果需要指定不同型別:

# 無引數的訊號

signal_noparameters = pqc.pyqtsignal(

)# 帶乙個引數(整數)的訊號

signal_oneparameter = pqc.pyqtsignal(

int)

# 帶乙個引數(整數或者字串)的過載版本的訊號

signal_oneparameter_overload = pqc.pyqtsignal(

[int],

[str])

# 帶兩個引數(整數,字串)的訊號

signal_twoparameters = pqc.pyqtsignal(

int,

str)

# 帶兩個引數([整數,整數]或者[整數,字串])的過載版本的訊號

signal_twoparameters_overload = pqc.pyqtsignal(

[int

,int],

[int

,str

])

self.signal.connect(self.signalcall)
connect後面連線的為接收到訊號後的觸發函式

def

job(self)

:# os.system('cd ' + dir_path + ' && svn up ' + dir_path)

output = os.popen(

'cd '

+ dir_path +

' && svn up '

+ dir_path)

# 發射訊號

self.signal.emit(output.read(

))

這裡調整一下之前的job函式,先將log通過emit()函式,傳遞訊號給槽函式signalcall(),然後通過槽函式來操作qt模組,設定qtextbrowser的文字,就可以成功。

def

signalcall

(self, log)

: self.log_box.settext(

str(log)

)

PyQt5 自定義訊號槽函式

1 簡介 自定義訊號槽函式,當訊號傳送的時候,可以呼叫被繫結的槽函式 2 功能實現 coding utf 8 簡介 內建訊號槽示例 from pyqt5.qtcore import qobject,pyqtsignal 訊號物件 class qtypesignal qobject 定義乙個訊號 se...

pyqt5 自定義訊號與槽

coding utf 8 from pyqt5.qt import a 0class window qwidget 宣告無引數的訊號 signal1 pyqtsignal 宣告帶乙個int型別引數的訊號 signal2 pyqtsignal int 宣告帶int和str型別引數的訊號 signal3...

PyQt5 自定義訊號槽 不同傳參

1 簡介 自定義的訊號 傳遞不同的引數 2 功能實現 coding utf 8 簡介 內建訊號槽訊號槽示例 from pyqt5.qtcore import qobject pyqtsignal class custsignal qobject 宣告乙個無引數的訊號 signal1 pyqtsign...