- PyQt 教程
- PyQt - 首頁
- PyQt - 簡介
- PyQt - 環境搭建
- PyQt - Hello World
- PyQt - 主要類
- PyQt - 使用 Qt Designer
- PyQt - 元物件
- PyQt 訊號與槽
- PyQt - 訊號和槽
- PyQt - 支援和訊號
- PyQt - 未繫結和已繫結訊號
- PyQt - 使用 PyQtSignal 建立新的訊號
- PyQt - 連線、斷開和發射訊號
- PyQt - 槽裝飾器
- PyQt - 槽連線
- PyQt 佈局
- PyQt - 佈局管理
- PyQt - QBoxLayout
- PyQt - QGridLayout
- PyQt - QFormLayout
- PyQt - QHBoxLayout
- PyQt - QVBoxLayout
- PyQt - QStackedLayout
- PyQt - QGraphicsGridLayout
- PyQt - QGraphicsAnchorLayout
- PyQt - QGraphicsLayout
- PyQt - QGraphicsLinearLayout
- PyQt 基本控制元件
- PyQt - 基本控制元件
- PyQt - QLabel 控制元件
- PyQt - QLineEdit 控制元件
- PyQt - QPushButton 控制元件
- PyQt - QRadioButton 控制元件
- PyQt - QCheckBox 控制元件
- PyQt - QComboBox 控制元件
- PyQt - QSpinBox 控制元件
- PyQt - QMessageBox
- PyQt - QDialogButtonBox 控制元件
- PyQt - QFontComboBox 控制元件
- PyQt - QDoubleSpinBox 控制元件
- PyQt - QToolBox 控制元件
- PyQt - QDialog 類
- PyQt - QMessageBox
- PyQt - 多文件介面
- PyQt - 拖放操作
- PyQt 繪圖 API
- PyQt - 繪圖 API
- PyQt 資料庫
- PyQt - 資料庫操作
- PyQt 核心知識
- PyQt - BrushStyle 常量
- PyQt - QClipboard
- PyQt - QPixmap 類
- PyQt 有用資源
- PyQt - 快速指南
- PyQt - 有用資源
- PyQt - 討論
pyqtSlot() 裝飾器
在 PyQt 中,**pyqtSlot()** 裝飾器允許將 Python 方法顯式標記為 Qt 槽,並可以定義其 C++ 簽名。本章我們將瞭解 **pyqtSlot()** 裝飾器的執行機制、引數及其用法。
pyqtSlot() 裝飾器簡介
在 PyQt 中,它使任何 Python 可呼叫物件都能在連線到訊號時充當槽。在某些情況下,需要顯式地將 Python 方法定義為 Qt 槽。我們可以使用 **pyqtSlot()** 函式裝飾器來實現。它可以顯式地將 Python 方法標記為 Qt 槽,並提供一種指定其 C++ 簽名的方法。
語法和引數
**pyqtSlot()** 裝飾器的語法如下:
PyQt5.QtCore.pyqtSlot(types[, name[, result[, revision=0]]])
傳遞給 pyqtSlot() 函式的不同引數具有不同的作用:
- **types** - 它定義構成槽的 C++ 簽名的型別。每個型別可以是 Python 型別物件或表示 C++ 型別的字串。
- **name:(可選)** - 它指定對 C++ 可見的槽的名稱。如果省略,則使用裝飾的 Python 方法的名稱。此引數作為關鍵字引數提供。
- **revision:(可選)** - 表示匯出到 QML 的槽的版本。此引數作為關鍵字引數指定。
- **result:(可選)** - 指示結果的型別。它可以是 Python 型別物件或指定 C++ 型別的字串。此引數作為關鍵字引數提供。
pyqtSlot() 裝飾器的優點
使用 pyqtSlot() 裝飾器將訊號連線到裝飾的 Python 方法具有以下幾個優點:
- 它透過減少記憶體使用來提高記憶體效率。
- 它還可以稍微提高效能,並使訊號連線更快。
示例 1:使用 pyqtSlot() 裝飾器定義簡單的槽
在這個例子中,我們定義一個繼承自 **QObject** 的類 **Foo**。在 Foo 中,我們宣告一個方法 foo() 並用 **@pyqtSlot()** 裝飾它,表明它是一個 Qt 槽。此槽不接受任何引數。當建立 Foo 的例項並呼叫 foo() 時,它會列印一條訊息,表明該槽已被呼叫。
from PyQt5.QtCore import QObject, pyqtSlot
class Foo(QObject):
@pyqtSlot()
def foo(self):
print("Simple slot foo() called")
# Create an instance of Foo
foo_instance = Foo()
# Call the slot
foo_instance.foo()
輸出
Simple slot foo() called
示例 2:使用 pyqtslot() 裝飾器建立帶多個引數的槽
在這個例子中,我們定義一個繼承自 QObject 的類 **Foo**。方法 **foo()** 用 **@pyqtSlot(int, str)** 裝飾,指定它是一個接受整數和字串作為引數的槽。當此槽用適當的引數呼叫時,它會列印一條訊息以及所提供引數的值。
from PyQt5.QtCore import QObject, pyqtSlot
class Foo(QObject):
@pyqtSlot(int, str)
def foo(self, arg1, arg2):
print("Slot foo() called with arguments:", arg1, arg2)
# Create an instance of Foo
foo_instance = Foo()
# Call the slot
foo_instance.foo(10, "Hello")
輸出
Slot foo() called with arguments: 10 Hello
示例 3:指定名稱和結果的槽
在這個例子中,在類 **Foo** 中,我們將方法 **foo()** 定義為一個槽,並用 **@pyqtSlot(int, name='bar')** 裝飾它。這定義了一個名為 **bar()** 的槽,它接受一個整數引數。當用整數引數呼叫時,它會列印一條訊息,表明 bar() 槽已被呼叫以及所提供的引數。
from PyQt5.QtCore import QObject, pyqtSlot
class Foo(QObject):
@pyqtSlot(int, name='bar')
def foo(self, arg1):
print("Slot bar() called with argument:", arg1)
# Create an instance of Foo
foo_instance = Foo()
# Call the slot
foo_instance.foo(20)
輸出
Slot bar() called with argument: 20