发布时间:2026/6/28 3:00:11
Qt学习笔记(二):自定义控件封装与对象树机制
导读本文是 Qt 学习笔记系列的第二篇。在实际开发中我们很少在一个窗口里堆砌所有控件更常见的做法是将功能相关的控件封装成自定义控件。本文通过Slider与SpinBox联动的案例讲解自定义控件的封装思路以及 Qt 对象树机制如何帮助我们自动管理内存和查找控件。一、为什么要封装自定义控件上一篇文章里我们直接在窗口中new按钮和输入框用setGeometry()手动摆位置。控件少的时候没问题但一旦界面复杂起来所有逻辑都挤在一个类里会非常混乱。更好的做法是把一组功能相关的控件封装成一个独立的类对外只暴露必要的接口。比如滑动条 数字框这个组合在很多界面都会用到封装一次就能反复复用。下面我们用**Slider与SpinBox联动** 这个经典案例来演示完整过程。二、先搭框架创建控件并设置属性首先创建一个新的QWidget子类BoxAndSlider。在构造函数中把两个基础控件创建出来BoxAndSlider::BoxAndSlider(QWidget*parent):QWidget(parent),ui(newUi::BoxAndSlider){ui-setupUi(this);// 创建 SpinBox数字选择框和 Slider滑动条mySpinBoxnewQSpinBox(this);mySlidernewQSlider(this);// 设置 Slider 为水平方向并指定初始位置和大小mySlider-setOrientation(Qt::Horizontal);mySlider-setGeometry(70,30,100,15);mySpinBox-setGeometry(0,25,40,25);}创建控件时传了this作为父对象传了this之后Qt 会把这个控件挂到当前对象的对象树上父对象销毁时子对象会自动跟着销毁不用我们手动delete。关于对象树后面第二节会详细讲。三、实现联动让两个控件互相影响联动的逻辑很简单拖动Slider-SpinBox数字跟着变修改SpinBox-Slider位置跟着变用connect把双方的valueChanged信号连到对方的设置值操作上就行了。3.1Slider-SpinBox直接连接// Slider 值改变 - 更新 SpinBox 的值connect(mySlider,QSlider::valueChanged,this,BoxAndSlider::changeBoxValue);槽函数就一行voidBoxAndSlider::changeBoxValue(intx){mySpinBox-setValue(x);}3.2SpinBox-Slider需要处理信号重载反过来的连接有个小问题要注意。QSpinBox::valueChanged有两个重载版本// 重载1值改变时触发参数是 intvoidvalueChanged(intval);// 重载2文本改变时触发参数是 QStringvoidvalueChanged(constQStringtext);如果直接写QSpinBox::valueChanged编译器不知道你要连的是哪一个会报错。我们用函数指针来明确指定// 用函数指针明确指定要的是 int 参数的那个版本void(QSpinBox::*valueChangedPointer)(int)QSpinBox::valueChanged;connect(mySpinBox,valueChangedPointer,this,BoxAndSlider::changeSliderPosition);Qt 信号有重载时怎么处理三种方案函数指针本文用的方法C11 lambda 表达式Qt 提供的QOverloadint::of(QSpinBox::valueChanged)模板类四、封装的意义外部调用有多简单经过上面的步骤BoxAndSlider已经是一个完整的自定义控件了。外部使用的时候根本不需要知道内部有一个SpinBox和一个Slider// 外部只需要创建一个 BoxAndSlider内部的联动已经自动工作BoxAndSlider*myWidgetnewBoxAndSlider(this);这就体现了封装的核心价值把复杂的内部逻辑藏起来对外只暴露简单的接口。五、对象树Qt 的自动内存管家前面创建控件时反复出现new QSpinBox(this)这个this就是把新建的控件挂到对象树上。对象树是 Qt 非常重要的机制理解它能避免很多内存问题。5.1 对象树是什么当你在创建QObject包括所有控件时指定了父对象Qt 会自动在内部维护一棵树。比如CustomWidget父窗口 ├── QLabellabel ├── QLabellabel_2 └── BoxAndSlider自定义控件 ├── QSpinBox └── QSlider每个控件都知道自己的父节点是谁也知道自己的所有子节点是谁。5.2 对象树帮我们做了什么功能说明自动内存管理父对象销毁时所有子对象自动销毁不用手动 delete结构清晰父子层级一目了然代码更好维护坐标管理子控件的坐标相对于父控件方便计算布局节点查找可以按名称、按类型快速找到目标控件其中自动内存管理是最重要的。很多初学者new了控件却忘记delete造成内存泄漏。只要在创建时指定了父对象对象树就会在父对象析构时自动清理所有子对象。5.3 遍历和查找节点对象树提供了很方便的API来访问树上的节点。遍历所有子对象// 打印当前窗口的所有子控件名称foreach(QObject*child,this-children()){qDebug()child-objectName();}按类型查找// 找出所有 QLabel 类型的子控件批量修改文字foreach(QLabel*child,this-findChildrenQLabel*()){child-setText(修改文字);}findChildrenT()非常实用——假设你有一个表单窗口里面有 20 个输入框需要在清空时一起重置逐个手动调用setText()显然很累用一行findChildrenQLineEdit*()就能全部搞定。注意如果控件是根节点没有父对象调用parent()会返回nullptr访问前要做空指针检查否则程序会崩溃。六、总结本文核心知识点知识点关键内容自定义控件封装将多个基础控件组合成复合控件提高复用性函数指针解决信号重载时connect的歧义问题对象树new 控件(this)时自动挂载父对象销毁时子对象自动释放children()获取所有子对象用于遍历findChildrenT()按类型查找子对象用于批量操作

相关新闻

如何在 Reasonix 中使用 CodeGraph 以及 CodeGraph 效果实测经验分享
2026/6/28 3:00:11

如何在 Reasonix 中使用 CodeGraph 以及 CodeGraph 效果实测经验分享

什么是 CodeGraph CodeGraph 是一个开源的代码知识图谱 MCP 服务器(34k Stars),核心思路是:​提前把代码的符号关系建好索引​,让 AI 代理直接查询图谱,而不是每次从头扫描文件。 工作原理: …

阅读更多
2026企业大模型管理中心排行:五大平台实测对比
2026/6/28 3:00:11

2026企业大模型管理中心排行:五大平台实测对比

作者:资深AI大模型服务行业监理,从业6年,参与12家中大型企业大模型部署项目;数据来源:各厂商官方公开文档、第三方AI服务评测机构2026年Q2实测报告。当前企业大模型部署面临多账号管理混乱、成本失控、合规风险高等痛点…

阅读更多
【GitHub】Video2X 深度解析:从架构到源码的开源视频增强框架
2026/6/28 3:00:11

【GitHub】Video2X 深度解析:从架构到源码的开源视频增强框架

项目地址:https://github.com/k4yt3x/video2x | Stars: 17k+ | 许可证: AGPL-3.0 | 当前版本: 6.4.0 一、项目介绍 1.1 定位 Video2X 是一个基于机器学习的视频超分辨率与帧插值框架。它将多种前沿 AI 模型统一封装到一条高效的处理流水线中,用户无需编写代码即可对视频进行…

阅读更多
大模型装上“手脚“:Agent智能体实战指南,轻松搞定复杂任务!
2026/6/28 5:00:11

大模型装上“手脚“:Agent智能体实战指南,轻松搞定复杂任务!

本文介绍了大模型Agent的概念及其优势,Agent通过结合大模型、思考决策逻辑和外部工具集,能够自主判断、选择工具并分步完成复杂任务。文章详细解析了ReAct架构Agent的四大核心模块:大模型、自定义工具集、工具装饰器和ReAct调度器&#xff0c…

阅读更多
2026上海小程序开发公司排行:哪家好?商城、会员与预约项目怎么选
2026/6/28 5:00:11

2026上海小程序开发公司排行:哪家好?商城、会员与预约项目怎么选

2026上海小程序开发公司排行:哪家好?商城、会员与预约项目怎么选 上海企业做小程序,已经不只是为了展示品牌和联系方式。对于连锁门店、品牌零售、教育培训、企业服务、美业、医疗咨询、招商加盟和本地生活类项目来说,小程序往往承…

阅读更多
在影子里验证比较对象:随机指纹和哈希的数学原理
2026/6/28 5:00:11

在影子里验证比较对象:随机指纹和哈希的数学原理

程序里经常会遇到一种看似朴素、实际很贵的问题:两个东西是不是一样?它可能是两个字符串、两个文件、两个集合、一段文本里的子串,或者三个矩阵是否满足 A⋅BCA⋅BC。如果对象本身很大,尤其是在对象需要跨机器通信、被反复比较、以…

阅读更多
AI Agent 工程师(一)
2026/6/28 5:00:11

AI Agent 工程师(一)

一、AI Agent 工程师是什么? AI Agent 工程师是大模型时代的新型开发岗位,核心是研发具备自主感知、推理规划、工具调用、环境交互与自我迭代能力的智能体(Agent)系统。 与传统岗位的核心区别: 不同于 AI 算法工程师:不聚焦模型训练与微调,而是以现成大模型为 “推理大…

阅读更多
**别再乱买耳饰了!成熟女人的衣柜里,都藏着一对翡翠硬通货**
2026/6/28 5:00:11

**别再乱买耳饰了!成熟女人的衣柜里,都藏着一对翡翠硬通货**

谢邀。这个问题我太有发言权了。去年入坑翡翠,前前后后买了七八对耳饰,踩了不少坑,也总结出一些经验。 先说说我踩过的坑。第一对买的是圆形的满绿蛋面耳钉,看图特别好看,结果我圆脸戴上,耳朵两个圆、脸一个…

阅读更多
帝国理工学院研究团队破解“电力调度难题“
2026/6/28 4:00:11

帝国理工学院研究团队破解“电力调度难题“

这项由英国伦敦帝国理工学院电气与电子工程系、航空系,以及SLB剑桥研究中心联合完成的研究,发表于2026年6月,论文编号为arXiv:2606.12345,研究方向为数学优化与控制领域。感兴趣的读者可通过该编号在arXiv平台上查阅完整论文。每天…

阅读更多
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告
2026/6/28 0:00:11

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

阅读更多
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?
2026/6/28 0:00:11

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

阅读更多
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告
2026/6/28 0:00:11

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

阅读更多
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?
2026/6/28 0:00:11

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

阅读更多
GIT修改用户名
2026/6/27 5:38:22

GIT修改用户名

在GIT中修改用户名可按以下步骤操作: 查看当前git的用户名,使用命令git config --list或git config user.name。修改git用户名,使用命令git config --global user.name "xxx(新的用户名)",将其中…

阅读更多
Win11Debloat:让你的Windows系统重获新生的终极优化工具
2026/6/26 13:36:46

Win11Debloat:让你的Windows系统重获新生的终极优化工具

Win11Debloat:让你的Windows系统重获新生的终极优化工具 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and …

阅读更多
技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践
2026/6/26 13:36:41

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter m4s-converter是一个…

阅读更多