起因是这个:https://blog.csdn.net/xulibo5828/article/details/155712173
在 Qt 中,"重载特性" 主要体现在部件的核心成员函数(如构造函数、事件处理函数、信号槽相关函数)支持参数不同的多态实现,核心目的是适配不同使用场景(如初始化方式、事件响应需求、信号槽连接逻辑)。以下是几个典型具有重载特性的核心部件及关键重载函数解析:
一、按钮类控件
1. QPushButton(按钮)
| 重载信号 | 连接语法 | 槽函数示例 |
|---|---|---|
clicked()(无参) |
btn.clicked.connect(slot) |
def slot(): print("无参点击") |
clicked(bool checked)(带勾选状态) |
btn.clicked[bool].connect(slot) |
def slot(checked): print(f"勾选状态:{checked}") |
完整示例:
python
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QHBoxLayout
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.button1 = QPushButton(self)
self.button1.setObjectName("TestButton")
self.button1.setCheckable(True)
layout = QHBoxLayout()
layout.addWidget(self.button1)
self.setLayout(layout)
self.num = 0
# 无参版本
self.button1.clicked.connect(lambda: print("无参点击触发"))
# 带参版本
self.button1.clicked[bool].connect(lambda checked: print(f"带参点击:{checked}"))
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
2. QCheckBox(复选框)
| 重载信号 | 连接语法 | 槽函数示例 |
|---|---|---|
stateChanged(int state)(状态码:0 = 未选 / 1 = 半选 / 2 = 选中) |
cb.stateChanged[int].connect(slot) |
def slot(state): print(f"状态码:{state}") |
clicked(bool checked)(仅选中 / 未选) |
cb.clicked[bool].connect(slot) |
def slot(checked): print(f"是否选中:{checked}") |
完整示例:
python
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QHBoxLayout, QCheckBox
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.cb = QCheckBox("三态复选框",self)
self.cb.setTristate(True) # 启用半选状态
# 状态变化(支持半选)
self.cb.stateChanged[int].connect(lambda state: print(f"状态:{state}"))
# 仅点击选中/未选
self.cb.clicked[bool].connect(lambda checked: print(f"选中:{checked}"))
layout = QHBoxLayout()
layout.addWidget(self.cb)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
二、数值调节类控件
1. QSlider(滑块)
| 重载信号 | 连接语法 | 槽函数示例 |
|---|---|---|
valueChanged(int)(数值变化,最常用) |
slider.valueChanged[int].connect(slot) |
def slot(val): print(f"滑块值:{val}") |
sliderMoved(int)(拖动过程中数值) |
slider.sliderMoved[int].connect(slot) |
def slot(val): print(f"拖动到:{val}") |
完整示例:
python
import sys
import time
from PySide6 import QtCore
from PySide6.QtCore import Qt, Slot
from PySide6.QtWidgets import QApplication, QMainWindow, QHBoxLayout, QSlider
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.slider = QSlider(self)
self.slider.setObjectName(u"testSlider")
self.slider.setOrientation(Qt.Horizontal)
layout = QHBoxLayout()
layout.addWidget(self.slider)
self.setLayout(layout)
QtCore.QMetaObject.connectSlotsByName(self)
@Slot(int)
def on_testSlider_valueChanged(self, value):
print(f"valueChanged 信号触发 → value: {value}")
@Slot(int)
def on_testSlider_sliderMoved(self, value):
print(f"sliderMoved 信号触发 → value: {value}")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
time.sleep(5)
window.slider.setValue(50)
sys.exit(app.exec())
spin = QSpinBox()
dspin = QDoubleSpinBox()
# QSpinBox 整数版
spin.valueChanged[int].connect(lambda val: print(f"整数:{val}"))
# QDoubleSpinBox 浮点数版
dspin.valueChanged[float].connect(lambda val: print(f"浮点数:{val}"))
# 字符串版(兼容所有数值输入框)
spin.valueChanged[str].connect(lambda val: print(f"字符串:{val}"))
三、文本输入类控件
1. QLineEdit(单行输入框)
| 重载信号 | 连接语法 | 槽函数示例 |
|---|---|---|
textChanged(str)(文本变化,实时) |
le.textChanged[str].connect(slot) |
def slot(txt): print(f"实时文本:{txt}") |
textEdited(str)(仅手动编辑,排除代码修改) |
le.textEdited[str].connect(slot) |
def slot(txt): print(f"手动编辑:{txt}") |
returnPressed()(按回车,无参) |
le.returnPressed.connect(slot) |
def slot(): print("回车触发") |
完整示例:
le = QLineEdit()
# 实时文本变化(代码/手动修改都触发)
le.textChanged[str].connect(lambda txt: print(f"实时:{txt}"))
# 仅手动编辑触发
le.textEdited[str].connect(lambda txt: print(f"手动:{txt}"))
# 按回车触发
le.returnPressed.connect(lambda: print("回车!"))
2. QTextEdit(多行文本框)
| 重载信号 | 连接语法 | 槽函数示例 |
|---|---|---|
textChanged()(无参,文本变化) |
te.textChanged.connect(slot) |
def slot(): print("文本变化") |
selectionChanged()(选中内容变化,无参) |
te.selectionChanged.connect(slot) |
def slot(): print("选中内容变了") |
完整示例:
te = QTextEdit()
# 文本变化
te.textChanged.connect(lambda: print("多行文本变化"))
# 选中内容变化
te.selectionChanged.connect(lambda: print(f"选中:{te.selectedText()}"))
四、列表 / 下拉框类控件
1. QComboBox(下拉框)
| 重载信号 | 连接语法 | 槽函数示例 |
|---|---|---|
currentIndexChanged(int)(索引变化) |
combo.currentIndexChanged[int].connect(slot) |
def slot(idx): print(f"索引:{idx}") |
currentTextChanged(str)(文本变化) |
combo.currentTextChanged[str].connect(slot) |
def slot(txt): print(f"文本:{txt}") |
完整示例:
combo = QComboBox()
combo.addItems(["苹果", "香蕉", "橙子"])
# 索引变化
combo.currentIndexChanged[int].connect(lambda idx: print(f"索引:{idx}"))
# 文本变化
combo.currentTextChanged[str].connect(lambda txt: print(f"文本:{txt}"))
2. QListWidget(列表控件)
| 重载信号 | 连接语法 | 槽函数示例 |
|---|---|---|
itemClicked(QListWidgetItem)(点击项) |
listw.itemClicked.connect(slot) |
def slot(item): print(f"点击项:{item.text()}") |
currentItemChanged(QListWidgetItem, QListWidgetItem)(当前项变化) |
listw.currentItemChanged.connect(slot) |
def slot(cur, prev): print(f"当前:{cur.text()},上一个:{prev.text()}") |
完整示例:
listw = QListWidget()
listw.addItems(["Python", "Java", "C++"])
# 点击列表项
listw.itemClicked.connect(lambda item: print(f"点击:{item.text()}"))
# 当前项变化(当前项+上一项)
listw.currentItemChanged.connect(lambda cur, prev: print(f"当前:{cur.text()}, 上一个:{prev.text() if prev else '无'}"))
五、日期时间类控件
QDateTimeEdit(日期时间输入框)
| 重载信号 | 连接语法 | 槽函数示例 |
|---|---|---|
dateTimeChanged(QDateTime)(日期时间变化) |
dtedit.dateTimeChanged.connect(slot) |
def slot(dt): print(f"时间:{dt.toString()}") |
dateChanged(QDate)(仅日期变化) |
dtedit.dateChanged.connect(slot) |
def slot(date): print(f"日期:{date.toString()}") |
timeChanged(QTime)(仅时间变化) |
dtedit.timeChanged.connect(slot) |
def slot(time): print(f"时间:{time.toString()}") |
完整示例:
from PySide6.QtCore import QDateTime, QDate, QTime
dtedit = QDateTimeEdit(QDateTime.currentDateTime())
# 日期时间整体变化
dtedit.dateTimeChanged.connect(lambda dt: print(f"完整时间:{dt.toString('yyyy-MM-dd HH:mm')}"))
# 仅日期变化
dtedit.dateChanged.connect(lambda date: print(f"日期:{date.toString('yyyy-MM-dd')}"))
# 仅时间变化
dtedit.timeChanged.connect(lambda time: print(f"时间:{time.toString('HH:mm')}"))
六、关键注意事项
-
参数类型匹配 :槽函数的参数数量 / 类型必须与信号重载版本一致(如
valueChanged[int]对应槽函数需接收int参数); -
无参信号简化 :无参重载信号可省略
[],直接connect(如btn.clicked.connect(slot)); -
断开连接 :断开重载信号需匹配相同的类型标注,如:
# 断开带参版本 btn.clicked[bool].disconnect(slot) # 断开无参版本 btn.clicked.disconnect(slot) -
自动连接(connectSlotsByName) :槽函数命名需匹配「参数类型」,如:
# 匹配 combo.currentIndexChanged(int) def on_combo_currentIndexChanged(self, idx): ... # 匹配 combo.currentTextChanged(str) def on_combo_currentTextChanged(self, txt): ...