QT中具有重载特性的一些部件

起因是这个: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')}"))

六、关键注意事项

  1. 参数类型匹配 :槽函数的参数数量 / 类型必须与信号重载版本一致(如 valueChanged[int] 对应槽函数需接收 int 参数);

  2. 无参信号简化 :无参重载信号可省略 [],直接 connect(如 btn.clicked.connect(slot));

  3. 断开连接 :断开重载信号需匹配相同的类型标注,如:

    复制代码
    # 断开带参版本
    btn.clicked[bool].disconnect(slot)
    # 断开无参版本
    btn.clicked.disconnect(slot)
  4. 自动连接(connectSlotsByName) :槽函数命名需匹配「参数类型」,如:

    复制代码
    # 匹配 combo.currentIndexChanged(int)
    def on_combo_currentIndexChanged(self, idx): ...
    # 匹配 combo.currentTextChanged(str)
    def on_combo_currentTextChanged(self, txt): ...
相关推荐
_深海凉_2 小时前
LeetCode热题100-颜色分类
python·算法·leetcode
AC赳赳老秦2 小时前
OpenClaw email技能:批量发送邮件、自动回复,高效处理工作邮件
运维·人工智能·python·django·自动化·deepseek·openclaw
zhaoshuzhaoshu2 小时前
Python 语法之数据结构详细解析
python
AI问答工程师3 小时前
Meta Muse Spark 的"思维压缩"到底是什么?我用 Python 复现了核心思路(附代码)
人工智能·python
zfan5204 小时前
python对Excel数据处理(1)
python·excel·pandas
小饕4 小时前
我从零搭建 RAG 学到的 10 件事
python
老歌老听老掉牙4 小时前
PyQt5+Qt Designer实战:可视化设计智能参数配置界面,告别手动布局时代!
python·qt
格鸰爱童话5 小时前
向AI学习项目技能(六)
java·人工智能·spring boot·python·学习
悟空爬虫-彪哥5 小时前
VRChat开发环境配置,零基础教程
python
数据知道5 小时前
《 Claude Code源码分析与实践》专栏目录
python·ai·github·claude code·claw code