Qt中自定义控件的三种实现方式

Qt中自定义控件的三种实现方式

在 Qt 应用开发中,标准控件往往无法满足所有需求。自定义控件允许开发者创建具有特定功能和外观的控件,提高代码复用性和界面一致性。Qt 提供了多种方式来开发自定义控件,从简单的组合现有控件到完全自定义绘制。

1. 继承现有控件并重写(最常用)

适用场景:已有控件功能基本满足,但需要添加行为或限制。

实现方式:继承如 QLineEditQPushButton 等控件,重写部分方法。

class MyCustomButton : public QPushButton {Q_OBJECT
public:explicit MyCustomButton(QWidget *parent = nullptr) : QPushButton(parent) {}protected:void paintEvent(QPaintEvent *event) override {Q_UNUSED(event);QPainter painter(this);// 自定义绘制逻辑painter.fillRect(rect(), Qt::red);painter.drawText(rect(), Qt::AlignCenter, text());}void mousePressEvent(QMouseEvent *event) override {// 自定义鼠标点击处理emit customClicked();QPushButton::mousePressEvent(event); // 调用父类实现}signals:void customClicked();
};

2. 组合现有控件(复合控件)

将多个现有控件组合起来,形成一个新的功能更复杂的控件。通过一个容器控件管理多个子控件,并对外提供统一的接口。

适用场景:需要将多个简单控件组合成一个功能单元,如自定义的日期选择器、带标签的输入框等。

实现要点

  • 通常继承自QWidget作为容器
  • 在构造函数中创建并布局子控件
  • 提供统一的接口用于操作子控件
  • 可以将子控件的信号汇总或转换为自定义信号
class SearchBox : public QWidget {Q_OBJECT
public:explicit SearchBox(QWidget *parent = nullptr) : QWidget(parent) {// 创建子控件m_lineEdit = new QLineEdit(this);m_button = new QPushButton("Search", this);// 设置布局QHBoxLayout *layout = new QHBoxLayout(this);layout->addWidget(m_lineEdit);layout->addWidget(m_button);// 连接信号槽connect(m_button, &QPushButton::clicked, this, &SearchBox::searchClicked);}QString getText() const {return m_lineEdit->text();}signals:void searchClicked();private:QLineEdit *m_lineEdit;QPushButton *m_button;
};

3. 完全自定义绘制(自绘控件)

直接继承QWidgetQFrame,完全通过重写paintEvent()函数实现所有绘制逻辑,不依赖任何现有控件。

适用场景:需要实现特殊外观或行为的控件,如仪表盘、自定义图表、音频波形显示等。

实现要点

通常继承自QWidget

重写paintEvent()实现所有绘制逻辑

重写sizeHint()提供默认大小建议

重写事件处理函数实现交互功能

可能需要使用QPainter进行复杂绘制

class DialGauge : public QWidget {Q_OBJECTQ_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged)
public:explicit DialGauge(QWidget *parent = nullptr) : QWidget(parent), m_value(0) {}int value() const { return m_value; }void setValue(int value) {if (m_value != value) {m_value = value;emit valueChanged(m_value);update(); // 触发重绘}}QSize sizeHint() const override {return QSize(200, 200);}protected:void paintEvent(QPaintEvent *event) override {Q_UNUSED(event);QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);// 绘制背景painter.drawEllipse(rect().adjusted(10, 10, -10, -10));// 绘制指针painter.save();painter.translate(width()/2, height()/2);painter.rotate(m_value * 1.8); // 将0-100转换为0-180度painter.drawLine(0, 0, 0, -height()/2 + 20);painter.restore();}signals:void valueChanged(int value);private:int m_value;
};

选择建议

  • 如需简单扩展现有控件功能,选择第一种方式
  • 如需组合多个控件形成新控件,选择第二种方式
  • 如需实现独特外观或复杂图形,选择第三种方式

参考文章:

1.Qt 自定义控件开发方法与实践

2.QT中自定义控件的三种实现方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96860.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

少儿舞蹈小程序(14)在线预约

目录1 创建数据模型2 搭建预约按钮3 搭建表单4 搭建管理功能整体效果总结目前我们的首页已经开发完毕了,包含轮播图、机构介绍、校区展示、作品与活动展示功能。家长在小程序了解了机构的基本情况之后,下一步就是参加试听,在线下真实体验一下…

TDengine 数据写入详细用户手册

TDengine 数据写入用户手册 概述 TDengine 提供了多种灵活的数据写入方式,以满足不同应用场景的需求。本手册将以智能电表场景为例,向初学者详细介绍各种数据写入方法的使用。 智能电表场景设定 假设我们需要为智能电表系统建立数据库: …

PTA 天梯赛 7-43:字符串关键字的散列映射

【题目来源】 https://pintia.cn/problem-sets/15/exam/problems/type/7?problemSetProblemId890 【题目描述】 给定一系列由大写英文字母组成的字符串关键字和素数 P,用移位法定义的散列函数 H(Key) 将关键字 Key 中的最后 3 个字符映射为整数,每个字…

Python核心技术开发指南(065)——with语句

版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl with语句定义 with语句是Python中用于简化资源管理的语法结构,通过上下文管理器(实现__enter__()和__exit__()方法的对象)确保资源在使用完毕后被正确释放,无论代码块是否发生异常。其核心作…

从基础到高级:一文快速认识MySQL UPDATE 语句

在数据库日常运维与开发中,数据更新是与数据查询同等重要的核心操作。MySQL 的 UPDATE 语句凭借其灵活的语法结构和强大的功能,能够满足从简单字段修改到复杂关联表更新的各类需求。然而,若使用不当,不仅可能导致数据一致性问题&a…

材料基因组计划(MGI)入门:高通量计算与数据管理最佳实践

点击 “AladdinEdu,同学们用得起的【H卡】算力平台”,注册即送-H卡级别算力,80G大显存,按量计费,灵活弹性,顶级配置,学生更享专属优惠。 摘要 材料基因组计划(Materials Genome Ini…

Vision Transformer (ViT) :Transformer在computer vision领域的应用(一)

在图像领域,CNN卷积神经网络结构已经成为了标配,所有的模型都是基于CNN来构造的。 而在NLP领域,自从Transformer横空出世之后,基本上也统治了NLP的各个领域。 基于Transformer的强大,一些论文的工作都是将Transformer也应用到CV领域,在这篇论文:AN IMAGE IS WORTH 16X1…

自动驾驶中的传感器技术45——Radar(6)

本文详细介绍4D雷达相关解决方案,4D雷达关键词:4D Imaging Radar 1、4D雷达特点 图1 4D雷达 vs 3D雷达图2 4D雷达虚拟通道数量不断增加图3 4D雷达 vs 3D雷达 vs 摄像头和激光雷达图4 毫米波雷达在不同驾驶等级下的应用需求Ref:https://pdf.d…

浏览器调试工具详解

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…

代码审计-PHP专题原生开发SQL注入1day分析构造正则搜索语句执行监控功能定位

挖掘技巧: -语句监控-数据库SQL监控排查可利用语句定向分析 -功能追踪-功能点文件SQL执行代码函数调用链追踪 -正则搜索-(update|select|insert|delete|).*?where.* 如何快速的在多个文件代码里面找脆弱: 1、看文件路径 2、看代码里面的变量&#…

Linux中:调试器gdb/cgdb的使用

引言在追寻光的路上不断前行,详细介绍Linux下gdb/cgdb的使用。一、准备• 程序的发布方式有两种,默认是 debug 模式和 release 模式。Linux gcc/g编译出来的二进制程序默认是release模式• 要使用gdb调试,必须在源代码生成⼆进制程序的时候加…

【算法】【链表】148.排序链表--通俗讲解

算法通俗讲解推荐阅读 【算法–链表】83.删除排序链表中的重复元素–通俗讲解 【算法–链表】删除排序链表中的重复元素 II–通俗讲解 【算法–链表】86.分割链表–通俗讲解 【算法】92.翻转链表Ⅱ–通俗讲解 【算法–链表】109.有序链表转换二叉搜索树–通俗讲解 【算法–链表…

计算机组成原理:存储系统概述

📌目录💾 存储系统概述:计算机的“记忆中枢”🏗️ 一、存储系统的层次结构:速度与容量的“黄金平衡”(一)经典存储层次金字塔(二)层次结构的设计原则(三&…

基于CNN/CRNN的汉字手写体识别:从图像到文字的智能解码

在人工智能浪潮的推动下, handwriting recognition(手写识别)技术已成为连接传统书写与数字世界的重要桥梁。其中,汉字手写体识别因其字符集的庞大和结构的复杂性,被视为模式识别领域最具挑战性的任务之一。近年来&…

【无人机】无人机用户体验测试策略详细介绍

一、 道:核心测试理念与目标核心理念: 用户体验测试的核心不是寻找功能Bug,而是评估用户在与无人机系统(包括飞行器、遥控器、APP)交互全过程中的主观感受、操作效率、情感变化和达成目标的难易度。我们的目标是让科技…

@RequiredArgsConstructor使用

spring推荐通过构造方法进行注入,如果需要注入的成员变量较多,手动创建构造方法可能需要频繁修改,这时,可以使用RequiredArgsConstructor。RequiredArgsConstructor是lombok中提供的注解,可以为类中final或者NotNull修…

TA-VLA——将关节力矩反馈融入VLA中:无需外部力传感器,即可完成汽车充电器插入(且可多次自主尝试)

前言 今25年9.13日,我在微博上写道: “我们为何24年起聚焦具身开发呢 23年我们做了一系列大模型应用,发觉卷飞了,c端搞不过大厂的工程迭代 流量获取,b端拼不过大厂的品牌,且大厂外 人人都可以搞 ​然&…

数据驱动破局商业信息不对称:中国商业查询平台的技术实践与方法论心得

前言 在当前中国经济高质量发展的浪潮中,企业数量已突破5000万户(截至2024年数据,延续2021年超5亿用户查询需求的增长趋势),但“企业质量参差、信息不透明”的痛点始终困扰着市场主体——企业合作前怕踩坑、个人求职担心“皮包公司”、投资者规避坏账风险,这些需求的核心…

光谱相机的图像模式

光谱相机通过不同的成像方式获取目标的光谱信息,主要分为以下几种图像模式:一、按成像方式分类‌点扫描模式(Whiskbroom)‌工作原理:逐点扫描目标区域,每个点获取完整光谱曲线特点:光谱分辨率最…

连接器上的pin针和胶芯如何快速组装?

在连接器生产过程中,pin 针与胶芯的组装是核心环节 —— 人工组装不仅效率低(单组耗时约 15-20 秒),还易因对齐偏差导致 pin 针弯曲、胶芯卡滞,不良率高达 3%-5%。针对这一问题,可通过 “机器精准排列 定制…