訊號和槽的機制

2022-07-08 00:03:30 字數 3435 閱讀 6698

一.介紹

gui應用程式是事件驅動的。 事件主要由應用程式的使用者生成。 但它們也可以通過其他手段產生,例如:網路連線,視窗

管理器或定時器。 當我們呼叫應用程式的exec_()方法時,應用程式進入主迴圈。 主迴圈獲取事件並將其傳送到物件。

在事件模型中,有三個參與者:

事件源是其狀態更改的物件。 它會生成事件。 事件物件(event)將狀態更改封裝在事件源中。 事件目標是要通知的物件。

事件源物件將處理事件的任務委託給事件目標。

pyqt5具有獨特的訊號和插槽機制來處理事件。 訊號和槽用於物件之間的通訊。 發生特定事件時發出訊號。 槽可以是任何

python可呼叫的函式。 當發射連線的訊號時會呼叫乙個槽。

接下來介紹幾種訊號與槽的對應關係

二.乙個訊號對應乙個槽

1

import sys

2from34

5class

demo(qwidget):

6def __init__(self):

7super(demo, self).__init__()

8 self.button = qpushbutton('

start

', self)

9self.button.clicked.connect(self.change_text)

1011

def change_text(self):

12 print('

change text')

1314

15if __name__ == '

__main__':

17 demo =demo()

18demo.show()

1. 類demo繼承qwidget,可以將qwidget看作是一種毛坯房,還沒有裝修,而我們往其中放入qpushbutton、qlabel等控制項就

相當於在裝修這間毛坯房。類似的毛坯房還有qmainwindow和qdialog等

2.連線訊號與槽函式。self.button就是乙個控制項,clicked(按鈕被點選)是該控制項的乙個訊號,connect()即連線,self.change_text即

下方定義的函式(我們稱之為槽函式)。所以通用的公式可以是:widget.signal.connect(slot);當然也可以解綁,即改為disconnect

3.當按鍵按下時,控制台輸出字串

三.多個訊號連線乙個槽

import sys

from

class

example(qwidget):

def __init__(self):

super().__init__()

self.initui()

def initui(self):

self.setgeometry(

200, 200, 300, 300

) bt1 = qpushbutton('

bt1'

,self)

bt1.setgeometry(

30,180,50,50

) bt2 = qpushbutton('

bt2'

,self)

bt2.setgeometry(

100,180,50,50

) bt3 = qpushbutton('

bt3'

,self)

bt3.setgeometry(

170,180,50,50

) bt1.clicked.connect(self.buttonclicked)

bt2.clicked.connect(self.buttonclicked)

bt3.clicked.connect(self.buttonclicked)

self.show()

def buttonclicked(self):

sender =self.sender()

if sender.text() == '

bt1'

: print(

'bt1')

elif sender.text() == '

bt2'

: print(

'bt2')

elif sender.text() == '

bt3'

: print(

'bt3')

if __name__ == '

__main__':

demo =example()

通過呼叫sender()方法來確定我們點選了哪個按鈕,判斷出後進行相應操作

四.自定義訊號

1import sys

2from

pyqt5.qtcore import pyqtsignal

3from45

6class

demo(qwidget):

7 my_signal =pyqtsignal() 89

def __init__(self):

10super(demo, self).__init__()

11 self.label = qlabel('

hello world

', self)

12self.my_signal.connect(self.change_text)

1314

def change_text(self):

15if self.label.text() == '

hello world':

16 self.label.settext('

hello pyqt5')

17else

:18 self.label.settext('

hello world')

1920

def mousepressevent(self, qmouseevent):

21self.my_signal.emit()

2223

24if __name__ == '

__main__':

26 demo =demo()

27demo.show()

1. 需要先導入pyqtsignal;

2. 例項化乙個自定義的訊號;

3. 將自定義的訊號連線到自定義的槽函式上;

4. mousepressevent()方法是許多控制項自帶的,這裡來自於qwidget。該方法用來監測滑鼠是否有按下。現在滑鼠若被按下,則會發出自定義的訊號。

訊號和槽機制

qt提供了訊號和槽機制用於完成介面操作的響應,是任意完成兩個qt物件之間的通訊機制。其中,訊號會在某個特定情況或動作下被觸發,槽是等同於接收並處理訊號的函式。常用的連線方式是 connect object1,signal signal object2,slot slot signal為物件objec...

QT的訊號和槽機制

為了解開程式介面中不同物件的耦合,qt提供了訊號和槽機制用於介面操作的響應,是完成任意兩個qt物件之間的通訊機制。qt物件包含許多預定義的訊號和槽。訊號 在某個特定情況或者動作下被觸發而發出的訊息 槽 接收並處理訊號的訊息的函式。當乙個特定的事件發生時,乙個訊號被傳送,與訊號相關聯的槽會響應訊號並完...

QT的訊號和槽機制

訊號和槽是qt程式設計的重要部分 它提供了物件間的通訊機制。迅速,型別安全,健壯,完全物件導向的用c 來實現的機制。我們在用 函式機制把某段響應 和乙個按鈕的動作相關聯的時候,通常把響應 寫成函式,然後把這個函式的位址指標傳給按鈕,當那個按鈕被單擊時,這個函式就會被執行。對於這種方式,以前的開發包不...