PyQt5學習之路 訊號與槽的初步認識與簡單使用

2021-09-10 02:29:05 字數 3345 閱讀 3718

一、訊號與槽的介紹

訊號和槽是qt中的核心機制,也是pyqt程式設計中物件之間進行通訊的機制,在qt中,每乙個qobject物件和pyqt中所有繼承自qwidget的控制項都支援訊號與槽機制。

當訊號發射時,連線的槽函式將會自動執行,在pyqt5中訊號與槽通過:

**object.signal.connect()**方法連線;

訊號與槽具有如下特點:

1)乙個訊號可以連線多個槽

2)乙個訊號可以連線另乙個訊號

3)訊號引數可以是任意python型別

4)乙個槽可以監聽多個訊號

5)訊號與槽的連線方式可以是同步連線,也可以是非同步連線

6)訊號與槽的連線可能會跨執行緒

7)訊號可能會斷開

訊號槽的執行機制:當事件或者狀態發生改變時,就會發出訊號,同時,訊號會觸發所有與這個事件(訊號)有關的函式(槽);訊號與槽可以是多對多的關係。

二、訊號的定義

內建訊號:自動定義

使用pyqt5.qtcore.pyqtsignal()方法可以為qobject建立乙個訊號,使用pyqtsignal()函式可以把訊號定義為類的屬性。

1、為qobject物件建立訊號

訊號必須在類建立時定義,並且只能在qobject的子類中定義。

舉例:

class foo(qobject):

valuechanged=pyqtsignal([dict],[list])

2、為控制項建立訊號

from pyqt5.qtcore import pyqtsignal

from pyqt5.qtwidgets import qmainwindow

class winform(qmainwindow):

btnclickedsignal=pyqtsignal()

以上**為自定義控制項winform建立了乙個btnclickedsignal訊號。

三、操作訊號

1、connect()函式可以把訊號繫結到槽函式上;

2、disconnect()函式可以解除訊號與槽函式的繫結;

3、emit()函式可以發射訊號;

四、訊號與槽的使用

1、內建訊號與槽的使用

指發射訊號時,使用視窗控制項的函式,而不是自定義的函式。

from pyqt5.qtwidgets import qmessagebox

import sys

widget=qwidget()

def showmsg():

#槽函式

qmessagebox.information(widget,"資訊","okk")

btn=qpushbutton("測試",widget)

#將clicked的內建訊號連線到自定義的槽函式

btn.clicked.connect(showmsg);

widget.show()

2、自定義訊號與槽的使用

指傳送訊號時,不使用視窗控制項的函式,而是使用自定義函式。

from pyqt5.qtcore import qobject,pyqtsignal

#訊號物件

class qtypesignal(qobject):

#定義乙個訊號

sendmsg=pyqtsignal(object)

def __init__(self):

super(qtypesignal,self).__init__()

def run(self):

#發射訊號

self.sendmsg.emit('hello pyqt5')

#槽物件

class qtypeslot(qobject):

def __init__(self):

super(qtypeslot,self).__init__()

#槽物件中的槽函式

def get(self,msg):

print("qslot get msg :"+msg)

if __name__=='__main__':

send=qtypesignal()

slot=qtypeslot()

#1print('---把訊號繫結到槽函式上')

send.sendmsg.connect(slot.get)

send.run()

#2print('---把訊號與槽函式的連線斷開')

send.sendmsg.disconnect(slot.get)

send.run()

五、使用lambda表示式傳遞自定義引數

傳遞自定義引數有兩種辦法:lambda表示式和partial函式,這裡主要介紹了lambda函式;

import sys

class winform(qmainwindow):

def __init__(self,parent=none):

super(winform, self).__init__(parent)

button1=qpushbutton('button1')

button2=qpushbutton('button2')

button1.clicked.connect(lambda:self.onbuttonclick(1))

button2.clicked.connect(lambda: self.onbuttonclick(2))

layout = qhboxlayout()

layout.addwidget(button1)

layout.addwidget(button2)

main_frame=qwidget()

main_frame.setlayout(layout)

self.setcentralwidget(main_frame)

def onbuttonclick(self,n):

print('button 被按下啦'.format(n))

qmessagebox.information(self,"資訊提示框",'button clicked'.format(n))

if __name__=="__main__":

form=winform()

form.show()

執行效果如下:

簡單實用感覺掌握的差不多啦,但是用到專案中可能還差點意思,明天繼續深入學習一下(▽

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(三) PyQt5的訊號和槽

我 如圖所示,我們建立乙個按鈕及乙個瀏覽器。什麼是訊號?比如按鈕的單擊,雙擊,按下,釋放等,都可以認為是乙個訊號 什麼是槽?對應的訊號,做出什麼應對,這要乙個應對在乙個函式中,我們可以認為這就是乙個訊號 槽關係 在qt designer中點選工具欄 注意不是工具盒 中的這個圖示 點選這個圖示後,就進...