Hello~ Internet!
來到這個系列的第二篇,經過上一篇的介紹大家應該都可以製作一個簡單的應用程式了吧!還沒看得可以上點這裡看上一篇介紹喔!
這一篇我們來開始製作事件讓元件跟我們互動起來吧!
這篇會介紹到:
- Signal and Slot ( 訊號與槽 ) 概念
- 2 種常用的使用方法
- 內建的 function
- 自訂 Signal and Slot
Signal and Slot ( 訊號與槽 ) 概念
Signal and Slot 是 Qt 本身的核心機制,是 PyQt5 物件之間通訊的方式。
每一個 QWidget 都繼承 QObject,所以每一種元件都可以使用 Signal and Slot。
Signal 是發出訊號的物件
Slot 就是接收訊號的插槽
每當訊號發出的時候就會自動執行連結到的 Slot Function
它有蠻多特點的
- 一個 Signal (訊號) 可以連接多個 Slot (插槽)
- 一個 Slot 也可以連結多個 Signal (訊號)
- 訊號可以加上參數
- 可以跨執行續
像要看更多的原文介紹的話可以看 Reference 喔!
2 種常用的使用方法
內建的 function
因為 QObject 內見就有 Connect 的 function,所以可以直接使用它來連結事件需要執行的 function。
要連結的方法很有規則,通常長得像這樣
物件.事件種類.connect(function)
物件: 只要是繼承 QObject 的都可以使用喔!
事件種類: 可以是 clicked、change、MouseButtonPress 等等的種類。
function: 可以是一般的 function 也可以放入自己 class method
還記得上一篇我們製作應用程式中有一個什麼功能都沒有的 button 嘛?
我們現在就讓它每被點擊一次就 print 一段文字吧
加上這一行 code
self.button.clicked.connect(self.btnOnClicked)
並且在 class 中加上 這一個 function
def btnOnClicked(self): print("Button 被按下了!")
貼心小提醒: 完整程式碼可以到 github 下載喔!
這邊給大家看一下現在class的樣子吧!
class MainWindow(QMainWindow): def __init__(self, parent=None): super().__init__(parent=parent) self.button = QtWidgets.QPushButton(self) self.button.setText("Hello") self.button.clicked.connect(self.btnOnClicked) def btnOnClicked(self): print("Button 被按下了!")
現在跑跑看 code 的話可以看到這樣的畫面
應用程式樣貌 按下按鈕的效果
自訂 Signal and Slot
另外一種做法是使用物件的方式創建
有時候為了把界面和邏輯部分分開,會需要使用這樣的方式實作 Signal & Slot
或是想要傳遞任何 Python 的物件當作參數的話,這樣做會很方便。
使用方法像是這樣
from PyQt5.QtCore import pyqtSignal sendmsg = pyqtSignal() sendmsg.emit()
利用 pyqtSignal() 創建 Signal 然後要自行 emit (發送訊號)
# 我目前只知道這樣做的好處是可以自訂傳送的參數
# 但是目前我還沒真正體會到這樣做的好處呢OAO
結尾:
到這邊大家就可以自己做一些有互動一點的應用程式了!
大家可以自己放一些其他的元件看看有什麼功能喔
下一篇我會介紹到怎麼美化介面,利用一種叫做 QSS 的語法!
不知道大家覺得這樣的系列文好不好 在下面留言告訴我喔
或是有什麼其他的想法都可以告訴我喔~
(不敢公開留言的話可以用 聯絡我 寄信跟我說喔~
那就先這樣啦!
我們下一篇見囉!
ㄅㄅ