[Python]PyQt 中的 pyqtSignal 和 pyqtSlot 教學

更新於 發佈於 閱讀時間約 9 分鐘

PyQt 中的 pyqtSignalpyqtSlot 教學

在使用 PyQt5 開發 GUI 程式時,信號 (Signal)槽 (Slot) 是重要的機制,用於元件之間的通訊。

PyQt 提供了 pyqtSignalpyqtSlot 來自定義信號和槽,進一步實現更靈活的功能。


一、pyqtSignal:自定義信號

pyqtSignal 是用來定義自訂信號的工具。你可以使用信號來通知其他部分程式某些事件發生了。

語法

from PyQt5.QtCore import QObject, pyqtSignal

class MyObject(QObject):
my_signal = pyqtSignal([參數類型1, 參數類型2, ...])
  • 信號特性:
    • 可以攜帶參數。
    • 需要先定義信號,然後在程式中觸發 (emit)。
    • 信號可以與槽函數連接。

範例:定義和使用信號

from PyQt5.QtCore import QObject, pyqtSignal

class Worker(QObject):
# 定義一個信號,攜帶一個字符串參數
progress_signal = pyqtSignal(str)

def do_work(self):
# 當工作進行時,發出信號
for i in range(5):
self.progress_signal.emit(f"Step {i + 1} completed!")

# 創建對象
worker = Worker()

# 定義槽函數
def handle_progress(message):
print(message)

# 將信號連接到槽
worker.progress_signal.connect(handle_progress)

# 開始工作並觸發信號
worker.do_work()

輸出:

Step 1 completed!
Step 2 completed!
Step 3 completed!
Step 4 completed!
Step 5 completed!

二、pyqtSlot:明確的槽函數

pyqtSlot 是用來定義槽函數的裝飾器。儘管 Python 的普通函數也能作為槽函數,但 pyqtSlot 能帶來一些優勢,例如:

  1. 提升效能:減少 Python 和 C++ 之間的邊界開銷。
  2. 強化類型檢查:明確指定槽函數接受的參數類型。

語法

from PyQt5.QtCore import pyqtSlot

@pyqtSlot(參數類型1, 參數類型2, ...)
def your_slot_function(...):
...

範例:使用 pyqtSlot 定義槽

from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot

class Worker(QObject):
progress_signal = pyqtSignal(str)

def __init__(self):
super().__init__()
# 將信號連接到槽
self.progress_signal.connect(self.handle_progress)

@pyqtSlot(str) # 使用 pyqtSlot 裝飾器
def handle_progress(self, message):
print(f"Received message: {message}")

def do_work(self):
for i in range(3):
self.progress_signal.emit(f"Task {i + 1} done")

# 測試
worker = Worker()
worker.do_work()

輸出:

Received message: Task 1 done
Received message: Task 2 done
Received message: Task 3 done

三、綜合範例:信號與槽的完整應用

以下是一個更複雜的例子,展示信號與槽的結合用法。

from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import QApplication, QLabel, QPushButton, QVBoxLayout, QWidget

class MyWidget(QWidget):
# 自訂信號,帶一個字符串參數
button_clicked_signal = pyqtSignal(str)

def __init__(self):
super().__init__()
self.setWindowTitle("信號與槽範例")

# 設置介面
self.label = QLabel("按下按鈕會觸發信號")
self.button = QPushButton("點我")
layout = QVBoxLayout()
layout.addWidget(self.label)
layout.addWidget(self.button)
self.setLayout(layout)

# 信號連接槽
self.button.clicked.connect(self.emit_signal)
self.button_clicked_signal.connect(self.update_label)

def emit_signal(self):
# 當按鈕被點擊時,發出自訂信號
self.button_clicked_signal.emit("按鈕被按下了!")

@pyqtSlot(str) # 使用 pyqtSlot 定義槽
def update_label(self, message):
self.label.setText(message)

# 測試程式
app = QApplication([])
window = MyWidget()
window.show()
app.exec_()

解釋:

  1. 信號定義:
    • button_clicked_signal = pyqtSignal(str) 定義了一個帶字符串參數的自訂信號。
  2. 信號發射:
    • 當按鈕被點擊時,執行 emit_signal,發出信號。
  3. 槽函數:
    • 使用 @pyqtSlot(str) 定義槽函數 update_label,更新介面上的標籤文字。
raw-image
raw-image



四、常見問題

1. pyqtSignalpyqtSlot 必須一起使用嗎?

  • 不必。普通函數也能作為槽函數,但 pyqtSlot 能提供更好的效能和類型檢查。

2. 一個信號可以連接多個槽嗎?

  • 可以,當信號發射時,所有連接的槽函數都會執行。

3. 槽函數可以有多個信號連接嗎?

  • 可以,信號之間並不衝突。

五、優化建議

  1. 使用 pyqtSlot 裝飾槽函數,提升效能。
  2. 利用信號攜帶參數,減少不必要的全域變數。
  3. 清晰地命名信號與槽,增強可讀性。
avatar-img
128會員
217內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
本篇文章將帶你一步步建立一個簡單的 PyQt5 GUI 應用程式,通過 yt-dlp 來下載 YT 視頻。你可以在這個應用中輸入視頻的 URL,並即時看到下載進度。 GUI介面 下載到開啟的資料夾路徑 前置條件 在開始之前,請確保你已經安裝了以下軟體和庫: 安裝 Python 確保你
使用 yt-dlp 下載 YT的教學 yt-dlp 是一款強大的命令行工具,用於下載來自 YT 及其他流媒體平台的音視頻資源。 本篇文章將參考yt-dlp github上 如何使用 yt-dlp 快速下載。 一、什麼是 yt-dlp? yt-dlp 是 youtube-dl 的分支項目,具
要讓滑鼠光標根據不同的繪圖模式改變形狀,可以使用 PyQt 的 QCursor 類來設置不同的滑鼠光標圖標。 假設是要畫ROI在畫布上,這樣當切換到矩形、圓形、筆等不同模式時,滑鼠光標會變為對應的圖標。 以下是如何實現這種效果的步驟: 定義光標變化的方法:根據不同的模式設置相應的光標,例如十字
在 PyQt 的應用程式中,我們經常需要追蹤滑鼠位置,尤其是在建立繪圖工具或處理繪圖邊界的情況下。以下是如何檢測滑鼠在畫布內外狀態的教學,並包含滑鼠事件處理及邊界判斷的細節。 目標 監測滑鼠進入與離開畫布的狀態,當滑鼠進入畫布範圍內時啟動繪製,而當滑鼠超出範圍時記錄最後一個有效位置。 實現邊
進一步探討 PyQt5 的一些進階功能,具體包括如何使用更多的控件如 QComboBox(下拉框)、QTableWidget(表格),如何使用 QMainWindow 建立多窗口應用,及如何自訂樣式和設計。 1. 使用 QComboBox(下拉框) QComboBox 是一個下拉框控件,用來顯示
以下是一個關於 PyQt5 基礎教學的簡單入門文,帶你一步步了解如何從零開始建立 PyQt5 應用程序。 1. 安裝 PyQt5 首先,確保你安裝了 PyQt5 庫。打開終端或命令提示符,輸入以下命令進行安裝: pip install pyqt5 2. 建立最簡單的 PyQt5 應用程序
本篇文章將帶你一步步建立一個簡單的 PyQt5 GUI 應用程式,通過 yt-dlp 來下載 YT 視頻。你可以在這個應用中輸入視頻的 URL,並即時看到下載進度。 GUI介面 下載到開啟的資料夾路徑 前置條件 在開始之前,請確保你已經安裝了以下軟體和庫: 安裝 Python 確保你
使用 yt-dlp 下載 YT的教學 yt-dlp 是一款強大的命令行工具,用於下載來自 YT 及其他流媒體平台的音視頻資源。 本篇文章將參考yt-dlp github上 如何使用 yt-dlp 快速下載。 一、什麼是 yt-dlp? yt-dlp 是 youtube-dl 的分支項目,具
要讓滑鼠光標根據不同的繪圖模式改變形狀,可以使用 PyQt 的 QCursor 類來設置不同的滑鼠光標圖標。 假設是要畫ROI在畫布上,這樣當切換到矩形、圓形、筆等不同模式時,滑鼠光標會變為對應的圖標。 以下是如何實現這種效果的步驟: 定義光標變化的方法:根據不同的模式設置相應的光標,例如十字
在 PyQt 的應用程式中,我們經常需要追蹤滑鼠位置,尤其是在建立繪圖工具或處理繪圖邊界的情況下。以下是如何檢測滑鼠在畫布內外狀態的教學,並包含滑鼠事件處理及邊界判斷的細節。 目標 監測滑鼠進入與離開畫布的狀態,當滑鼠進入畫布範圍內時啟動繪製,而當滑鼠超出範圍時記錄最後一個有效位置。 實現邊
進一步探討 PyQt5 的一些進階功能,具體包括如何使用更多的控件如 QComboBox(下拉框)、QTableWidget(表格),如何使用 QMainWindow 建立多窗口應用,及如何自訂樣式和設計。 1. 使用 QComboBox(下拉框) QComboBox 是一個下拉框控件,用來顯示
以下是一個關於 PyQt5 基礎教學的簡單入門文,帶你一步步了解如何從零開始建立 PyQt5 應用程序。 1. 安裝 PyQt5 首先,確保你安裝了 PyQt5 庫。打開終端或命令提示符,輸入以下命令進行安裝: pip install pyqt5 2. 建立最簡單的 PyQt5 應用程序
你可能也想看
Google News 追蹤
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
本文利用pyqt5,使用pyttsx3將QLineEdit(單行輸入框)的字串,轉成語音呈現出來。
Thumbnail
Python的模組和庫是可重用的程式碼塊,可透過import語句引入。特定部分可以透過from和import引入,並可使用as指定別名。第三方模組可透過pip工具安裝並在程式碼中使用。此外,也可以創建自定義模組並在其他Python文件中引用。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
本篇文章將教你如何使用Python和PyQt5來建立一個GUI應用程式。PyQt5是一個相當流行的Python模組,透過這個文章你將學習如何使用它來建立一個互動式的應用程式。
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
設計程式來讀取欲傳送訊息之參數txt檔案,再利用程式自動傳出訊息至LINE群組。能簡易使用於任何場合。
Thumbnail
本文將介紹如何在 Python 中導入和使用標準函式庫中的模組,以及如何創建自定義模組和套件。我們將透過具體的例子和程式碼,讓你更好的理解和應用模組和套件。
Thumbnail
函式是 Python 程式設計中的非常重要的一環,能夠增強程式碼的可讀性和重用性。本文將介紹函式的基本觀念,包含函式的定義、調用、參數類型、返回值,以及在不同範圍內的行為。
Thumbnail
本文將介紹 Python 中的字符串操作方法與輸入輸出,從基本的索引、切片到進階的字符串方法,還有如何進行輸入輸出操作,這對於文本處理和用戶交互來說非常重要。
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
本文利用pyqt5,使用pyttsx3將QLineEdit(單行輸入框)的字串,轉成語音呈現出來。
Thumbnail
Python的模組和庫是可重用的程式碼塊,可透過import語句引入。特定部分可以透過from和import引入,並可使用as指定別名。第三方模組可透過pip工具安裝並在程式碼中使用。此外,也可以創建自定義模組並在其他Python文件中引用。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
本篇文章將教你如何使用Python和PyQt5來建立一個GUI應用程式。PyQt5是一個相當流行的Python模組,透過這個文章你將學習如何使用它來建立一個互動式的應用程式。
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
設計程式來讀取欲傳送訊息之參數txt檔案,再利用程式自動傳出訊息至LINE群組。能簡易使用於任何場合。
Thumbnail
本文將介紹如何在 Python 中導入和使用標準函式庫中的模組,以及如何創建自定義模組和套件。我們將透過具體的例子和程式碼,讓你更好的理解和應用模組和套件。
Thumbnail
函式是 Python 程式設計中的非常重要的一環,能夠增強程式碼的可讀性和重用性。本文將介紹函式的基本觀念,包含函式的定義、調用、參數類型、返回值,以及在不同範圍內的行為。
Thumbnail
本文將介紹 Python 中的字符串操作方法與輸入輸出,從基本的索引、切片到進階的字符串方法,還有如何進行輸入輸出操作,這對於文本處理和用戶交互來說非常重要。