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 小时前
爬虫框架:Feapder使用心得
爬虫·python
皇族崛起2 小时前
【3D标注】- Unreal Engine 5.7 与 Python 交互基础
python·3d·ue5
世转神风-2 小时前
winDbg专有名词解释
qt·windbg
你想知道什么?3 小时前
Python基础篇(上) 学习笔记
笔记·python·学习
Swizard3 小时前
速度与激情:Android Python + CameraX 零拷贝实时推理指南
android·python·ai·移动开发
一直跑3 小时前
Liunx服务器centos7离线升级内核(Liunx服务器centos7.9离线/升级系统内核)
python
leocoder3 小时前
大模型基础概念入门 + 代码实战(实现一个多轮会话机器人)
前端·人工智能·python
Buxxxxxx4 小时前
DAY 37 深入理解SHAP图
python
ada7_4 小时前
LeetCode(python)108.将有序数组转换为二叉搜索树
数据结构·python·算法·leetcode
请一直在路上4 小时前
python文件打包成exe(虚拟环境打包,减少体积)
开发语言·python