pyqt的線程之間的通信是通過信號to槽來實現(xiàn)的,首先你在線程類里面聲明一個全局槽比如:
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了海豐免費建站歡迎大家使用!
class?imThread(QtCore.QThread):
imslot?=?QtCore.pyqtSignal()
這里是要重點注意,上面的是沒有任何參數(shù)的一個信號,如果你需要參數(shù)的話,你可以在里面添加參數(shù)類型,例如:
imslot1?=?QtCore.pyqtSignal(str)????#這是一個帶字符串參數(shù)的信號
imslot2?=?QtCore.pyqtSignal(int)????#這是一個帶整型參數(shù)的信號
imslot3?=?QtCore.pyqtSignal(bool)???#這是一個帶布爾參數(shù)的信號
當(dāng)然了,如果你需要多個參數(shù)的話,同樣地往里面加就是了,qt也沒有要求參數(shù)必須是同類型的,所以可以這樣:
imslot1?=?QtCore.pyqtSignal(str,?int)????#這是一個帶整型和字符串的參數(shù)信號
imslot2?=?QtCore.pyqtSignal(int,?str,?str)????#這是一個帶整型和兩個字符串的參數(shù)信號
imslot3?=?QtCore.pyqtSignal(bool,?str)?#這是一個帶布爾和字符串的參數(shù)信號
在線程的run方法里面來定義執(zhí)行信號:
self.imslot.emit()
這里也是需要重點注意的是,上面這個接口是沒有參數(shù)的,如果你是要參數(shù)的話,是需要這樣寫:
self.imslot1[str].emit('hello')
self.imslot2[int].emit(1)
self.imslot3[bool].emit(False)
多參數(shù)的是這樣
self.imslot1[str,?int].emit('hello',?1)
self.imslot2[int,?str,?str].emit(1,?"hello",?"world")
self.imslot3[bool,?str].emit(False,?'hello')
以上就是在線程類里面完成信號定義了,接下來就是邏輯層成定義一個函數(shù)槽來連接線程類里面的信號,這個也很簡單,比如我在主線程類里面定義一個方法:
def?imSlot():
print?'ok'
以上這個是槽函數(shù),接下來是實現(xiàn)信號槽的連接
imThread.imslot.connect('imSlot')
這個就是信號槽的連接方式,當(dāng)然了,這個是沒有參數(shù)的一個信號槽,那么帶參數(shù)的怎么寫呢?也很簡單!首先定義一個槽函數(shù):
def?imSlot(para):
print?para
這個是帶參數(shù)的槽函數(shù),下面是:
imThread.imslot[str].connect('imSlot')
以上就是線程之間的方法了,子線程在執(zhí)行的通行經(jīng)過執(zhí)行信號的話,子線程可以安全地執(zhí)行而不會出現(xiàn)GUI主線程卡死的情況了。
在使用信號調(diào)用disconnect()方法斷開信號和槽的連接時,信號可以帶簽名也可不帶簽名,參數(shù)可以沒有也可以有一個,這些組合情況下disconnect的處理是不同的,具體情況如下:
?1.PyQt5.14的官網(wǎng)上介紹說如果參數(shù)為空,表示信號連接的所有槽都會斷開,這句話是有歧義的,只是斷開所有與信號簽名匹配的槽,如果調(diào)用時信號不帶簽名,則默認斷開第一個簽名對應(yīng)的所有槽;
?2.如果斷開時信號帶簽名,參數(shù)為槽函數(shù),但二者不匹配時則會引發(fā)異常;
?3.如果斷開時信號帶簽名,參數(shù)為connection對象,斷開的是與簽名匹配的連接信號和槽,不按參數(shù)進行連接斷開;
?4.如果斷開時信號不帶簽名,參數(shù)為connection對象,則按connection對象斷開連接。
"""
【簡介】
內(nèi)置信號槽示例
"""
from PyQt5.QtCore import QObject, pyqtSignal
class QTypeSignal(QObject):
# 定義一個信號
sendmsg = pyqtSignal(object)
class QTypeSlot(QObject):
def init (self):
super(QTypeSlot, self). init ()
if name == ' main ':
send = QTypeSignal()
slot = QTypeSlot()
# 1
print('--- 把信號綁定到槽函數(shù) ---')
send.sendmsg.connect(slot.get)
send.run()
from PyQt5.QtCore import QObject , pyqtSignal
class QTypeSignal(QObject):
#定義一個信號
sendmsg = pyqtSignal( str,str)
class QTypeSlot(QObject):
def init ( self):
super( QTypeSlot, self). init ()
if name == ' main ':
send = QTypeSignal()
slot = QTypeSlot()
答: 可以將事件連接到槽函數(shù),然后在槽函數(shù)里面設(shè)置相關(guān)內(nèi)容。這樣的話每次事件觸發(fā)時,槽函數(shù)里面的內(nèi)容就可以執(zhí)行,根據(jù)內(nèi)容也就可以判斷知道哪個事件被觸發(fā)了。信號綁定槽函數(shù)的方法有如下所示。
就比如說你要捕獲按鈕的點擊事件(clicked),當(dāng)按鈕(定義為btn)被點擊后,我們調(diào)用一個on_click函數(shù)(這是我們自己定義的),那么最后的代碼就是這樣btn.clicked.connect(on_click),就可以把按鈕的點擊事件與槽函數(shù)相連。
本文名稱:python槽函數(shù) python槽函數(shù)參數(shù)傳遞
URL標題:http://muchs.cn/article30/hjeoso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、域名注冊、ChatGPT、營銷型網(wǎng)站建設(shè)、網(wǎng)站改版、App設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)