一句話理解pyside6的信號(hào)和槽機(jī)制
PySide6 的信號(hào)按控件類型分類,不同控件有專屬的核心信號(hào),同時(shí)也有一些通用信號(hào)適用于所有控件。
下面我會(huì)按 “通用信號(hào) + 常用控件專屬信號(hào)” 的維度,列舉商業(yè)化開發(fā)中高頻使用的信號(hào),并附上場景說明,方便你對(duì)應(yīng)實(shí)際開發(fā)需求:
一、通用信號(hào)(所有控件都具備)
這類信號(hào)是所有 Qt 控件的基礎(chǔ),適用于任意 UI 元素:
| 信號(hào)名 | 含義(發(fā)生了什么) | 附帶數(shù)據(jù) | 典型場景 |
|---|---|---|---|
| clicked | 控件被鼠標(biāo)點(diǎn)擊(最常用) | 無(或 bool) | 按鈕點(diǎn)擊、復(fù)選框選中 |
| pressed | 鼠標(biāo)按下控件(未松開) | 無 | 實(shí)現(xiàn) “按下時(shí)高亮” 等交互 |
| released | 鼠標(biāo)松開控件(按下后) | 無 | 配合 pressed 做按壓動(dòng)效 |
| hovered | 鼠標(biāo)懸停在控件上 | 無 | 懸浮提示、按鈕變色 |
| focusIn | 控件獲得焦點(diǎn)(如輸入框選中) | 無 | 輸入框獲得焦點(diǎn)時(shí)高亮邊框 |
| focusOut | 控件失去焦點(diǎn) | 無 | 輸入框失去焦點(diǎn)時(shí)校驗(yàn)內(nèi)容 |
| destroyed | 控件被銷毀 | 控件對(duì)象 | 資源釋放、清理關(guān)聯(lián)數(shù)據(jù) |
二、常用控件專屬信號(hào)(商業(yè)化開發(fā)高頻)
1. 輸入類控件(QLineEdit/QTextEdit)
| 信號(hào)名 | 含義(發(fā)生了什么) | 附帶數(shù)據(jù) | 典型場景 |
|---|---|---|---|
| textChanged | 文本內(nèi)容發(fā)生變化(實(shí)時(shí)) | 最新文本(str) | 實(shí)時(shí)搜索、動(dòng)態(tài)校驗(yàn)輸入內(nèi)容 |
| textEdited | 文本被用戶編輯(排除代碼修改) | 最新文本(str) | 區(qū)分用戶輸入和程序自動(dòng)修改 |
| returnPressed | 按下回車鍵 | 無 | 輸入完成后提交(如搜索框) |
| editingFinished | 編輯完成(失去焦點(diǎn) / 按回車) | 無 | 最終校驗(yàn)輸入內(nèi)容 |
2. 選擇類控件(QComboBox/QSlider/QCheckBox)
| 信號(hào)名 | 含義(發(fā)生了什么) | 附帶數(shù)據(jù) | 典型場景 |
|---|---|---|---|
| currentIndexChanged | 下拉框選中項(xiàng)索引變化 | 索引(int) | 下拉框選值后聯(lián)動(dòng)更新其他控件 |
| currentTextChanged | 下拉框選中項(xiàng)文本變化 | 文本(str) | 直接獲取下拉框選中的文字 |
| valueChanged | 滑塊 / 進(jìn)度條數(shù)值變化 | 數(shù)值(int/float) | 音量調(diào)節(jié)、進(jìn)度展示 |
| stateChanged | 復(fù)選框 / 單選框狀態(tài)變化 | 狀態(tài)(int) | 勾選后顯示 / 隱藏相關(guān)選項(xiàng) |
3. 表格 / 列表類控件(QTableView/QListWidget)
| 信號(hào)名 | 含義(發(fā)生了什么) | 附帶數(shù)據(jù) | 典型場景 |
|---|---|---|---|
| currentRowChanged | 表格選中行變化 | 行索引(int) | 選中行后加載該行詳情 |
| cellClicked | 表格單元格被點(diǎn)擊 | 行 / 列索引(int,int) | 點(diǎn)擊單元格編輯內(nèi)容 |
| itemClicked | 列表項(xiàng)被點(diǎn)擊 | 列表項(xiàng)對(duì)象 | 選中列表項(xiàng)后執(zhí)行操作 |
| itemSelectionChanged | 列表 / 表格選中項(xiàng)變化 | 無 | 批量操作前判斷選中狀態(tài) |
4. 窗口 / 布局類(QMainWindow/QDialog)
| 信號(hào)名 | 含義(發(fā)生了什么) | 附帶數(shù)據(jù) | 典型場景 |
|---|---|---|---|
| closeEvent | 窗口關(guān)閉前觸發(fā) | 關(guān)閉事件對(duì)象 | 提示 “是否保存未修改內(nèi)容” |
| resizeEvent | 窗口大小調(diào)整 | 大小事件對(duì)象 | 自適應(yīng)布局、重繪圖表 |
| accepted | 對(duì)話框點(diǎn)擊 “確認(rèn)” 按鈕 | 無 | 對(duì)話框提交數(shù)據(jù) |
| rejected | 對(duì)話框點(diǎn)擊 “取消” 按鈕 | 無 | 對(duì)話框放棄操作 |
三、自定義信號(hào)(商業(yè)化開發(fā)必備)
除了 Qt 內(nèi)置信號(hào),還可以根據(jù)業(yè)務(wù)需求自定義信號(hào),這是處理復(fù)雜邏輯的核心:
from PySide6.QtCore import QObject, Signal
# 定義自定義信號(hào)(可指定參數(shù)類型)
class MyBusinessLogic(QObject):
# 無參數(shù)信號(hào)
task_started = Signal()
# 帶參數(shù)信號(hào)(支持多類型、多參數(shù))
task_progress = Signal(int, str) # 進(jìn)度值 + 提示文本
task_finished = Signal(bool, str) # 是否成功 + 結(jié)果信息
# 使用自定義信號(hào)
logic = MyBusinessLogic()
# 綁定槽函數(shù)
logic.task_progress.connect(lambda value, msg: print(f"進(jìn)度:{value}%,{msg}"))
# 發(fā)射信號(hào)(觸發(fā)事件)
logic.task_progress.emit(50, "正在處理數(shù)據(jù)...")
四、快速查找信號(hào)的實(shí)用技巧
- 官方文檔:訪問 Qt 官方文檔(https://doc.qt.io/qt-6/),搜索控件名(如
QPushButton),在 “Signals” 標(biāo)簽下可查看所有內(nèi)置信號(hào); - 代碼提示:在 PyCharm/VS Code 中,輸入
控件對(duì)象.后,編輯器會(huì)自動(dòng)提示以小寫開頭的信號(hào)(如btn.clicked); - 核心原則:記住 “信號(hào) = 發(fā)生了什么”,比如想處理 “輸入框文本變化”,就找
textChanged;想處理 “表格行選中”,就找currentRowChanged。
- PySide6 信號(hào)按通用 / 控件專屬分類,核心是 “對(duì)應(yīng)控件的交互事件”;
- 高頻信號(hào):
clicked(點(diǎn)擊)、textChanged(文本變化)、currentIndexChanged(選中項(xiàng)變化)、valueChanged(數(shù)值變化); - 自定義信號(hào)可滿足商業(yè)程序的個(gè)性化交互需求,是擴(kuò)展信號(hào)槽機(jī)制的關(guān)鍵。
可以再用一個(gè)更通俗的生活例子鞏固這個(gè)認(rèn)知:
- 信號(hào) = 家里的門鈴響了(“發(fā)生了什么”:有人按門鈴這個(gè)事件);
- 槽 = 你走到門口開門、詢問對(duì)方身份(“接收到信號(hào)后要做什么”:響應(yīng)門鈴事件的具體動(dòng)作)。
再用代碼印證這個(gè)核心邏輯
import sys
from PySide6.QtWidgets import QApplication, QWidget, QPushButton
from PySide6.QtCore import Slot
class Demo(QWidget):
def __init__(self):
super().__init__()
self.btn = QPushButton("點(diǎn)我觸發(fā)信號(hào)", self)
# 信號(hào):btn.clicked → 發(fā)生了“按鈕被點(diǎn)擊”這件事
self.btn.clicked.connect(self.handle_click)
# 槽:handle_click → 收到“按鈕被點(diǎn)擊”信號(hào)后,要做的事
@Slot()
def handle_click(self):
print("信號(hào):按鈕被點(diǎn)擊了 → 槽:執(zhí)行打印操作")
if __name__ == "__main__":
app = QApplication(sys.argv)
win = Demo()
win.show()
sys.exit(app.exec())
補(bǔ)充一個(gè)小細(xì)節(jié)(不影響核心理解,但更完整)
信號(hào)除了 “告知發(fā)生了什么”,還可以附帶 “這件事的相關(guān)信息”(比如 “誰按的門鈴”),槽也可以接收這些信息并針對(duì)性處理:
import sys
from PySide6.QtWidgets import QApplication, QWidget, QSlider
from PySide6.QtCore import Slot
class Demo(QWidget):
def __init__(self):
super().__init__()
self.slider = QSlider(self)
self.slider.setRange(0, 100)
# 信號(hào):valueChanged → 發(fā)生了“滑塊值變化”這件事,附帶“當(dāng)前值”這個(gè)信息
self.slider.valueChanged.connect(self.handle_slider)
# 槽:handle_slider → 收到“滑塊值變化”信號(hào)后,根據(jù)附帶的數(shù)值做對(duì)應(yīng)操作
@Slot(int)
def handle_slider(self, value): # value 是信號(hào)附帶的“相關(guān)信息”
print(f"信號(hào):滑塊值變了 → 槽:當(dāng)前值是{value},執(zhí)行打印")
if __name__ == "__main__":
app = QApplication(sys.argv)
win = Demo()
win.show()
sys.exit(app.exec())
- 信號(hào) = 發(fā)生了什么(事件),槽 = 收到信號(hào)后要做什么(響應(yīng)動(dòng)作);
- 擴(kuò)展細(xì)節(jié):信號(hào)可附帶 “事件相關(guān)信息”,槽可接收這些信息做針對(duì)性處理;
- 這個(gè)邏輯是 PySide6 所有交互的基礎(chǔ),不管是簡單按鈕點(diǎn)擊,還是復(fù)雜的跨線程通信、表格交互,本質(zhì)都是 “事件發(fā)生(信號(hào))→ 執(zhí)行動(dòng)作(槽)”。
到此這篇關(guān)于一句話理解pyside6的信號(hào)和槽機(jī)制的文章就介紹到這了,更多相關(guān)pyside6 信號(hào)和槽機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)ip地址查詢經(jīng)緯度定位詳解
這篇文章主要介紹了python實(shí)現(xiàn)ip地址查詢經(jīng)緯度定位詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
python簡單幾步實(shí)現(xiàn)時(shí)間日期處理到數(shù)據(jù)文件的讀寫
這篇文章主要為大家介紹了python簡單幾步實(shí)現(xiàn)時(shí)間日期處理到數(shù)據(jù)文件的讀寫詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
python3 enum模塊的應(yīng)用實(shí)例詳解
這篇文章主要介紹了python3 enum模塊的應(yīng)用 ,文中提到了字典類型的缺點(diǎn)及特點(diǎn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08

