方格精選

[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
留言分享你的想法!
avatar-img
螃蟹_crab的沙龍
141會員
251內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
螃蟹_crab的沙龍的其他內容
2025/02/10
在 PyQt 中,信號與槽(Signal & Slot)機制是用來實現物件間通信的核心機制。 當信號被發射時,槽函數(Slot)根據預先連接的規則被調用。這一過程有時候會呈現出「排隊」的現象,即信號並非立即執行,而是先放入事件隊列,等待事件循環(Event Loop)逐一處理。 本文將介紹其原理
Thumbnail
2025/02/10
在 PyQt 中,信號與槽(Signal & Slot)機制是用來實現物件間通信的核心機制。 當信號被發射時,槽函數(Slot)根據預先連接的規則被調用。這一過程有時候會呈現出「排隊」的現象,即信號並非立即執行,而是先放入事件隊列,等待事件循環(Event Loop)逐一處理。 本文將介紹其原理
Thumbnail
2024/11/16
本篇文章將帶你一步步建立一個簡單的 PyQt5 GUI 應用程式,通過 yt-dlp 來下載 YT 視頻。你可以在這個應用中輸入視頻的 URL,並即時看到下載進度。 GUI介面 下載到開啟的資料夾路徑 前置條件 在開始之前,請確保你已經安裝了以下軟體和庫: 安裝 Python 確保你
Thumbnail
2024/11/16
本篇文章將帶你一步步建立一個簡單的 PyQt5 GUI 應用程式,通過 yt-dlp 來下載 YT 視頻。你可以在這個應用中輸入視頻的 URL,並即時看到下載進度。 GUI介面 下載到開啟的資料夾路徑 前置條件 在開始之前,請確保你已經安裝了以下軟體和庫: 安裝 Python 確保你
Thumbnail
2024/11/16
使用 yt-dlp 下載 YT的教學 yt-dlp 是一款強大的命令行工具,用於下載來自 YT 及其他流媒體平台的音視頻資源。 本篇文章將參考yt-dlp github上 如何使用 yt-dlp 快速下載。 一、什麼是 yt-dlp? yt-dlp 是 youtube-dl 的分支項目,具
2024/11/16
使用 yt-dlp 下載 YT的教學 yt-dlp 是一款強大的命令行工具,用於下載來自 YT 及其他流媒體平台的音視頻資源。 本篇文章將參考yt-dlp github上 如何使用 yt-dlp 快速下載。 一、什麼是 yt-dlp? yt-dlp 是 youtube-dl 的分支項目,具
看更多
你可能也想看
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
PyQt 中的 pyqtSignal 和 pyqtSlot 教學 在使用 PyQt5 開發 GUI 程式時,信號 (Signal) 和 槽 (Slot) 是重要的機制,用於元件之間的通訊。 PyQt 提供了 pyqtSignal 和 pyqtSlot 來自定義信號和槽,進一步實現更靈活的功能。
Thumbnail
PyQt 中的 pyqtSignal 和 pyqtSlot 教學 在使用 PyQt5 開發 GUI 程式時,信號 (Signal) 和 槽 (Slot) 是重要的機制,用於元件之間的通訊。 PyQt 提供了 pyqtSignal 和 pyqtSlot 來自定義信號和槽,進一步實現更靈活的功能。
Thumbnail
本文利用pyqt5,使用pyttsx3將QLineEdit(單行輸入框)的字串,轉成語音呈現出來。
Thumbnail
本文利用pyqt5,使用pyttsx3將QLineEdit(單行輸入框)的字串,轉成語音呈現出來。
Thumbnail
Python的模組和庫是可重用的程式碼塊,可透過import語句引入。特定部分可以透過from和import引入,並可使用as指定別名。第三方模組可透過pip工具安裝並在程式碼中使用。此外,也可以創建自定義模組並在其他Python文件中引用。
Thumbnail
Python的模組和庫是可重用的程式碼塊,可透過import語句引入。特定部分可以透過from和import引入,並可使用as指定別名。第三方模組可透過pip工具安裝並在程式碼中使用。此外,也可以創建自定義模組並在其他Python文件中引用。
Thumbnail
本文介紹了Python中的物件導向程式設計的重要概念,包括類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射。每個概念都有對應的程式碼範例來說明其用法和功能。這些概念對於理解和使用Python進行物件導向程式設計至關重要。
Thumbnail
本文介紹了Python中的物件導向程式設計的重要概念,包括類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射。每個概念都有對應的程式碼範例來說明其用法和功能。這些概念對於理解和使用Python進行物件導向程式設計至關重要。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
在Python中,queue是一個非常有用的模块。 它提供了多種佇列(queue)實現,用於在多線程環境中安全地交換信息或者數據。 佇列(queue)是一種先進先出(FIFO)的數據結構,允許在佇列的一端插入元素,另一端取出元素。(FIFO 是First In, First Out 的縮寫)
Thumbnail
在Python中,queue是一個非常有用的模块。 它提供了多種佇列(queue)實現,用於在多線程環境中安全地交換信息或者數據。 佇列(queue)是一種先進先出(FIFO)的數據結構,允許在佇列的一端插入元素,另一端取出元素。(FIFO 是First In, First Out 的縮寫)
Thumbnail
本篇文章將教你如何使用Python和PyQt5來建立一個GUI應用程式。PyQt5是一個相當流行的Python模組,透過這個文章你將學習如何使用它來建立一個互動式的應用程式。
Thumbnail
本篇文章將教你如何使用Python和PyQt5來建立一個GUI應用程式。PyQt5是一個相當流行的Python模組,透過這個文章你將學習如何使用它來建立一個互動式的應用程式。
Thumbnail
本文介紹了Python中函式引數的*args和**kwargs用法,通過*args處理可變數量的位置引數,通過**kwargs處理可變數量的關鍵字引數。不僅介紹了相應的語法和程式範例,還解釋了它們的順序問題和建議的慣例用法。
Thumbnail
本文介紹了Python中函式引數的*args和**kwargs用法,通過*args處理可變數量的位置引數,通過**kwargs處理可變數量的關鍵字引數。不僅介紹了相應的語法和程式範例,還解釋了它們的順序問題和建議的慣例用法。
Thumbnail
在第十二課中,我們將學習 Python 中的模塊和包的概念。 模塊和包是 Python 中組織程式碼的主要方式,它們讓你能夠以邏輯和易於管理的方式組織你的程式碼。
Thumbnail
在第十二課中,我們將學習 Python 中的模塊和包的概念。 模塊和包是 Python 中組織程式碼的主要方式,它們讓你能夠以邏輯和易於管理的方式組織你的程式碼。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News