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): ...
相关推荐
喵手11 分钟前
Python爬虫零基础入门【第二章:网页基础·第1节】网页是怎么工作的:URL、请求、响应、状态码?
爬虫·python·python爬虫实战·python爬虫工程化实战·python爬虫零基础入门·网页基础
忧郁的橙子.43 分钟前
26期_01_Pyhton判断语句
python
快乐小胡!1 小时前
【自动化测试】Selenium选择/定位元素的基本方法
python·selenium·测试工具
高洁011 小时前
数字孪生与数字样机的技术基础:建模与仿真
python·算法·机器学习·transformer·知识图谱
喵手1 小时前
Python爬虫零基础入门【第二章:网页基础·第4节】新手最常栽的坑:编码、时区、空值、脏数据!
爬虫·python·python爬虫实战·python爬虫工程化实战·python爬虫零基础入门·python爬虫编码时区·爬虫编码时区
淡忘旧梦2 小时前
词错误率/WER算法讲解
人工智能·笔记·python·深度学习·算法
癫狂的兔子2 小时前
【Python】【爬虫】爬取虎扑网NBA排行数据
数据库·爬虫·python
Aurora-Borealis.2 小时前
Day40 早停策略和模型权重的保存
python
好大哥呀2 小时前
如何在手机上运行Python程序
开发语言·python·智能手机
_codemonster2 小时前
手语识别及翻译项目实战系列(一)环境准备
人工智能·python·计算机视觉