一.介紹
gui應用程式是事件驅動的。 事件主要由應用程式的使用者生成。 但它們也可以通過其他手段產生,例如:網路連線,視窗
管理器或定時器。 當我們呼叫應用程式的exec_()方法時,應用程式進入主迴圈。 主迴圈獲取事件並將其傳送到物件。
在事件模型中,有三個參與者:
事件源是其狀態更改的物件。 它會生成事件。 事件物件(event)將狀態更改封裝在事件源中。 事件目標是要通知的物件。
事件源物件將處理事件的任務委託給事件目標。
pyqt5具有獨特的訊號和插槽機制來處理事件。 訊號和槽用於物件之間的通訊。 發生特定事件時發出訊號。 槽可以是任何
python可呼叫的函式。 當發射連線的訊號時會呼叫乙個槽。
接下來介紹幾種訊號與槽的對應關係
二.乙個訊號對應乙個槽
1import 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 來實現的機制。我們在用 函式機制把某段響應 和乙個按鈕的動作相關聯的時候,通常把響應 寫成函式,然後把這個函式的位址指標傳給按鈕,當那個按鈕被單擊時,這個函式就會被執行。對於這種方式,以前的開發包不...