發表於 PyQT5Python

【Python】PyQT5 Sin,Cos Matplotlib 動畫應用程式 -2 PyQT5 Input 互動與 Signal-Slot 概念

Hello~ Internet!
來到這個系列的第二篇,經過上一篇的介紹大家應該都可以製作一個簡單的應用程式了吧!還沒看得可以上點這裡看上一篇介紹喔!
這一篇我們來開始製作事件讓元件跟我們互動起來吧!

這篇會介紹到:

  • Signal and Slot ( 訊號與槽 ) 概念
  • 2 種常用的使用方法
    1. 內建的 function
    2. 自訂 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 的語法!

不知道大家覺得這樣的系列文好不好 在下面留言告訴我喔
或是有什麼其他的想法都可以告訴我喔~
(不敢公開留言的話可以用 聯絡我 寄信跟我說喔~

那就先這樣啦!
我們下一篇見囉!

ㄅㄅ

作者:

一位 熱愛資工領域、喜歡好笑事物、偶爾打打網球 的學生 ! For A Better Me!

發表迴響

Please log in using one of these methods to post your comment:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.