PyQt5訊號 槽機制

2022-04-29 07:33:06 字數 4438 閱讀 5494

signal -> emit -> slot

signal.connect(slot)

signal.disconnect(slot)

訊號 (singal) 可以連線無數多個槽 (slot),或者沒有連線槽也沒有問題,訊號也可以連線其他的訊號。

連線的基本語句形式如下: who.singal.connect(slot)

訊號是 qobject 的乙個屬性。只有通過 connect方法連線起來,訊號-槽機制就建立起來了。類似的訊號還有 disconnect 方法和emit 方法。

disconnect 就是斷開訊號-槽機制,而 emit 就是啟用訊號。

訊號都是類的乙個屬性,新的訊號必須繼承自 qobject,然後由 pyqt5.qtcore.pyqtsingal(在 pyqt4 下是 pyqt4.qtcore.pyqtsingal)方法建立,這個方法接受的引數中最重要的是 types 型別,比如 int, bool 之類的,你可以認為這是訊號傳遞的引數型別,但實際傳遞這些引數值的是 emit 方法。然後槽實際上就是經過特殊封裝的函式,這些函式當然需要接受一些引數或者不接受引數,而這些引數具體的值傳進來的是由 emit 方法執行的,然後我們通過 who.singal.connect(slot) 這樣的形式將某個訊號和某個槽連線起來, who 的訊號,然後訊號類自帶的連線方法,然後連線到 slot 某個函式上,在這裡隱藏的乙個重要細節就是 emit 方法,比如說你定義乙個新的訊號,需要將點選螢幕的具體 x,y 座標傳送出去,內建的訊號-槽將這一機制都完成了,如果你自己定義的訊號和槽的話,比如 pyqtsingal(int,int) ,傳送給 func(x,y),具體 x 和 y 的值你需要通過 emit(x,y) 來傳送。至於什麼時候傳送,已經傳送的 x,y 值的獲取,這應該又是另外乙個訊號-槽機制的細節。

from pyqt5.qtcore import *

from pyqt5.qtgui import *

class

finddialog(qdialog):

findnext =pyqtsignal(str, qt.casesensitivity)

findprevious = pyqtsignal(str, qt.casesensitivity)

class

finddialog(qdialog):

......

@pyqtslot()

deffindclicked(self):

text =self.lineedit.text()

ifself.casecheckbox.ischecked():

cs =qt.casesensitive

else

: cs =qt.caseinsensitive

ifself.backwardcheckbox.ischecked():

self.findprevious.emit(text, cs)

else

: self.findnext.emit(text, cs)

class

finddialog(qdialog):

......

@pyqtslot()

deffindclicked(self):

......

ifself.backwardcheckbox.ischecked():

self.findprevious.emit(text, cs)

else

: self.findnext.emit(text, cs)

4. 以下是完整的示例:

#

!/usr/bin/env python

#-*- coding:utf-8 -*-

'''查詢對話方塊示例, 自定義訊號槽

'''from pyqt5.qtwidgets import *

from pyqt5.qtcore import *

from pyqt5.qtgui import *

class

finddialog(qdialog):

findnext =pyqtsignal(str, qt.casesensitivity)

findprevious =pyqtsignal(str, qt.casesensitivity)

def__init__(self, parent =none):

super().

__init__

(parent)

label = qlabel(self.tr('

find &what:'))

self.lineedit =qlineedit()

label.setbuddy(self.lineedit)

self.casecheckbox = qcheckbox(self.tr('

match &case'))

self.backwardcheckbox = qcheckbox(self.tr('

search &backward'))

self.findbutton = qpushbutton(self.tr('

&find'))

self.findbutton.setdefault(true)

self.findbutton.setenabled(false)

closebutton = qpushbutton(self.tr('

close'))

self.lineedit.textchanged.connect(self.enablefindbutton)

self.findbutton.clicked.connect(self.findclicked)

closebutton.clicked.connect(self.close)

topleftlayout =qhboxlayout()

topleftlayout.addwidget(label)

topleftlayout.addwidget(self.lineedit)

leftlayout =qvboxlayout()

leftlayout.addlayout(topleftlayout)

leftlayout.addwidget(self.casecheckbox)

leftlayout.addwidget(self.backwardcheckbox)

rightlayout =qvboxlayout()

rightlayout.addwidget(self.findbutton)

rightlayout.addwidget(closebutton)

rightlayout.addstretch()

mainlayout =qhboxlayout()

mainlayout.addlayout(leftlayout)

mainlayout.addlayout(rightlayout)

self.setlayout(mainlayout)

self.setwindowtitle(self.tr(

'find'))

self.setfixedheight(self.sizehint().height())

defenablefindbutton(self, text):

self.findbutton.setenabled(bool(text))

@pyqtslot()

deffindclicked(self):

text =self.lineedit.text()

ifself.casecheckbox.ischecked():

cs =qt.casesensitive

else

: cs =qt.caseinsensitive

ifself.backwardcheckbox.ischecked():

self.findprevious.emit(text, cs)

else

: self.findnext.emit(text, cs)

if__name__ == '

__main__':

import

sys finddialog =finddialog()

deffind(text, cs):

print('

find:

', text, 'cs'

, cs)

deffindp(text, cs):

print('

findp:

', text, 'cs'

, cs)

finddialog.findnext.connect(find)

finddialog.findprevious.connect(findp)

finddialog.show()

d

pyqt5 訊號與槽

描述self.obj.destroyed.connect destroy cao 觸發後會執行槽函式,並給槽函式返回釋放物件 self.obj.blocksignals true 臨時打斷訊號 self.obj.objectnamechanged.disconnect 斷開訊號與槽的連線 self....

pyqt5 訊號與槽

訊號與槽 是pyqt的精髓,要多總結學習一下 定義通俗解釋 事件源 狀態發生改變的物件,它產生事件 source obj 按鈕 物件 事件目標 是想要被通知的物件 target obj 被點選 狀態發生改變 事件物件 封裝了事件源中的狀態變化 evnet obj 執行 呼叫函式 def use se...

pyqt5入門 002 訊號 槽

繪製乙個帶有toolbutton的視窗,按照教程001的步驟執行的話,會得到乙個如圖的視窗。但是視窗裡的按鈕無論我們怎麼點,都沒有任何的反應,這就不好玩了。如何打破江局呢,那就要利用 編輯訊號 槽 了 由於太簡單且實現的功能有限,在此不做過多的講解 若要實現更多的功能首先新建立乙個py檔案 from...