Qt/C++编写超精美自定义控件(历时9年更新迭代/超202个控件/祖传原创)

一、前言

无论是哪一门开发框架,如果涉及到UI这块,肯定需要用到自定义控件,越复杂功能越多的项目,自定义控件的数量就越多,最开始的时候可能每个自定义控件都针对特定的应用场景,甚至里面带了特定的场景的一些设置和处理,随着项目数量的增多,有些控件又专门提取出来共性,做成了通用的自定义控件,意味着控件主要做外观处理,用户根据不同的场景需要,设置不同的外观和规则,就这样搞来搞去搞到现在,已经超过了202个控件,慢慢的积累迭代和更新,历经超过9年的时间不断的完善,尤其是对不同Qt版本、不同编译器、不同操作系统的支持,其中Qt6改动比较大,很多方法或者类改名或者废弃了,需要用类似的方法处理,在改完整个自定义控件大全后,特意整理了升级到Qt6经验大全,放在开源主页上,合并在Qt开发经验中,目前该经验可能是国内Qt开发界最受欢迎的开发经验总结。

二、效果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、体验地址

  1. 国内站点:https://gitee.com/feiyangqingyun
  2. 国际站点:https://github.com/feiyangqingyun
  3. 个人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
  4. 体验地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 文件名:bin_quc。

四、功能特点

  1. 超过202个精美控件并持续不断迭代更新升级,种类超多,控件类型极其丰富。
  2. 涵盖了各种仪表盘、进度条、进度球、指南针、曲线图、标尺、温度计、导航条、导航栏,flatui、高亮按钮、滑动选择器、农历、广告轮播、饼状图、环形图、时间轴、拓展控件、增强控件等。
  3. 每个类都是独立的一个.h头文件和.cpp实现文件组成,零耦合,不依赖其他文件,方便单个控件独立出来以源码形式集成到项目中,方便直观。
  4. 控件数量远超其他第三方控件库比如qwt集成的控件数量,使用方式也比其简单友好零耦合。
  5. 支持任意Qt版本,亲测Qt4/5/6的所有版本,全部纯Qt编写,QWidget+QPainter绘制。
  6. 支持任意编译器,包括但不限于mingw、msvc、gcc、clang等编译器。
  7. 支持任意操作系统,包括但不限于windows、linux、mac、android、uos、银河麒麟、各种国产linux、嵌入式linux、树莓派、香橙派、全志H3等。
  8. 支持编译生成设计师插件,可直接集成到QtCreator的控件栏中,和自带的控件一样使用,大部分效果只要设置几个属性即可,极为方便。
  9. 支持编译生成独立的非插件形式的动态库文件,体积小,比如嵌入式linux不支持designer只需要动态库的形式。
  10. 每个控件都有一个单独的完整的使用demo,方便参考学习单个控件使用,非常适合初学者。
  11. 提供一个所有控件使用的集成的example,方便快速查看所有控件的效果。
  12. 支持直接源码集成到example的方式,方便编译到安卓,for web套件等。
  13. 支持编译成wasm文件,直接网页运行,可以在谷歌、火狐、edge等浏览器运行,原生性能。
  14. 每个控件的源代码都有详细中文注释,都按照统一设计规范编写,方便学习自定义控件的编写。
  15. 每个控件都内置默认配色,demo对应的配色都非常精美。
  16. 部分控件提供多种样式风格选择,多种指示器样式选择。
  17. 所有控件自适应布局和窗体拉伸变化,自动缩放。
  18. 配套额外的自定义控件属性设计器,类似组态设计器,纯中文属性名称,支持拖曳设计,所见即所得,支持导入导出xml格式。
  19. 集成fontawesome图形字体+阿里巴巴iconfont收藏的几百个图形字体,享受图形字体带来的乐趣。
  20. 所有控件最后生成一个dll动态库文件,可以直接集成到qtcreator中拖曳设计使用。
  21. 控件源码全部分门别类存放,pri模块形式集成,提供控件对照表快速查找对应控件和说明。

五、相关代码

#pragma execution_character_set("utf-8")#include "frmexamplessimple.h"
#include "ui_frmexamplessimple.h"
#include "head.h"#include "../../demo/gauge/gaugecar/frmgaugecar.h"
#include "../../demo/gauge/gaugecloud/frmgaugecloud.h"
#include "../../demo/gauge/gaugecolor/frmgaugecolor.h"
#include "../../demo/gauge/gaugecompass/frmgaugecompass.h"
#include "../../demo/gauge/gaugecompasspan/frmgaugecompasspan.h"
#include "../../demo/gauge/gaugedial/frmgaugedial.h"
#include "../../demo/gauge/gaugemini/frmgaugemini.h"
#include "../../demo/gauge/gaugepanel/frmgaugepanel.h"
#include "../../demo/gauge/gaugeprogress/frmgaugeprogress.h"
#include "../../demo/gauge/gaugespeed/frmgaugespeed.h"#include "../../demo/progress/progressbutton/frmprogressbutton.h"
#include "../../demo/progress/progresspercent/frmprogresspercent.h"
#include "../../demo/progress/progressring/frmprogressring.h"
#include "../../demo/progress/progressshadow/frmprogressshadow.h"
#include "../../demo/progress/progresstip/frmprogresstip.h"#include "../../demo/painter/battery/frmbattery.h"
#include "../../demo/painter/lightbutton/frmlightbutton.h"
#include "../../demo/painter/lunarcalendarwidget/frmlunarcalendarwidget.h"
#include "../../demo/painter/magicpoolfish/frmmagicpoolfish.h"
#include "../../demo/painter/telwidget/frmtelwidget.h"#include "../../demo/custom/customring/frmcustomring.h"
#include "../../demo/custom/customgraphics/frmcustomgraphics.h"
#include "../../demo/custom/shadowcalendar/frmshadowcalendar.h"
#include "../../demo/custom/spiderchart/frmspiderchart.h"
#include "../../demo/custom/timeaxis/frmtimeaxis.h"
#include "../../demo/custom/customdart/frmcustomdart.h"
#include "../../demo/custom/tasktableview/frmtasktableview.h"#include "../../demo/ruler/rulerprogress/frmrulerprogress.h"
#include "../../demo/color/colorpanel/frmcolorpanel.h"
#include "../../demo/image/adswidgetx/frmadswidgetx.h"
#include "../../demo/image/imageclock/frmimageclock.h"
#include "../../demo/other/selectwidget/frmselectwidget.h"
#include "../../demo/wave/wavewater/frmwavewater.h"
#include "../../demo/slider/sliderselect/frmsliderselect.h"
#include "../../demo/flight/frmflightall.h"frmExamplesSimple::frmExamplesSimple(QWidget *parent) : QWidget(parent), ui(new Ui::frmExamplesSimple)
{ui->setupUi(this);this->initForm();this->addItem();
}frmExamplesSimple::~frmExamplesSimple()
{delete ui;
}void frmExamplesSimple::paintEvent(QPaintEvent *)
{QPainter painter(this);painter.drawTiledPixmap(rect(), bgPix);
}void frmExamplesSimple::initForm()
{bgPix = QPixmap(":/image/bg.png");connect(ui->navListView, SIGNAL(pressed(QString, QString)), this, SLOT(pressed(QString, QString)));//设置文本边距ui->navListView->setChildMargin(28);ui->navListView->setFixedWidth(190);ui->navListView->setExpendMode(NavListView::ExpendMode_SingleClick);ui->navListView->setSeparateColor(QColor(40, 43, 51));//设置子节点颜色ui->navListView->setChildBgNormalColor(QColor(40, 43, 51));ui->navListView->setChildBgSelectedColor(QColor(20, 20, 20));ui->navListView->setChildBgHoverColor(QColor(20, 20, 20));ui->navListView->setChildTextNormalColor(QColor(180, 180, 180));ui->navListView->setChildTextSelectedColor(QColor(250, 250, 250));ui->navListView->setChildTextHoverColor(QColor(255, 255, 255));//设置父节点颜色ui->navListView->setParentBgNormalColor(QColor(57, 61, 73));ui->navListView->setParentBgSelectedColor(QColor(78, 83, 102));ui->navListView->setParentBgHoverColor(QColor(78, 83, 102));ui->navListView->setParentTextNormalColor(QColor(250, 250, 250));ui->navListView->setParentTextSelectedColor(QColor(250, 250, 250));ui->navListView->setParentTextHoverColor(QColor(250, 250, 250));
}void frmExamplesSimple::addItem()
{ui->stackedWidget->addWidget(new frmGaugeCar);ui->stackedWidget->addWidget(new frmGaugeCloud);ui->stackedWidget->addWidget(new frmGaugeColor);ui->stackedWidget->addWidget(new frmGaugeCompass);ui->stackedWidget->addWidget(new frmGaugeCompassPan);ui->stackedWidget->addWidget(new frmGaugeDial);ui->stackedWidget->addWidget(new frmGaugeMini);ui->stackedWidget->addWidget(new frmGaugePanel);ui->stackedWidget->addWidget(new frmGaugeProgress);ui->stackedWidget->addWidget(new frmGaugeSpeed);ui->stackedWidget->addWidget(new frmProgressButton);ui->stackedWidget->addWidget(new frmProgressPercent);ui->stackedWidget->addWidget(new frmProgressRing);ui->stackedWidget->addWidget(new frmProgressShadow);ui->stackedWidget->addWidget(new frmProgressTip);ui->stackedWidget->addWidget(new frmBattery);ui->stackedWidget->addWidget(new frmLightButton);ui->stackedWidget->addWidget(new frmLunarCalendarWidget);ui->stackedWidget->addWidget(new frmMagicPoolFish);ui->stackedWidget->addWidget(new frmTelWidget);ui->stackedWidget->addWidget(new frmCustomRing);ui->stackedWidget->addWidget(new frmCustomGraphics);ui->stackedWidget->addWidget(new frmShadowCalendar);ui->stackedWidget->addWidget(new frmSpiderChart);ui->stackedWidget->addWidget(new frmTimeAxis);ui->stackedWidget->addWidget(new frmCustomDart);ui->stackedWidget->addWidget(new frmTaskTableView);ui->stackedWidget->addWidget(new frmRulerProgress);ui->stackedWidget->addWidget(new frmColorPanel);ui->stackedWidget->addWidget(new frmAdsWidgetx);ui->stackedWidget->addWidget(new frmImageClock);ui->stackedWidget->addWidget(new frmSelectWidget);ui->stackedWidget->addWidget(new frmWaveWater);ui->stackedWidget->addWidget(new frmSliderSelect);ui->stackedWidget->addWidget(new frmFlightAll);listName << "汽车仪表盘" << "云台仪表盘" << "多彩仪表盘" << "指南针表盘" << "指南针面板"<< "旋转仪表盘" << "迷你仪表盘" << "面板仪表盘" << "进度仪表盘" << "速度仪表盘";listName << "按钮进度条" << "百分比进度" << "环形进度条" << "光晕进度条" << "提示进度条";listName << "电池电量" << "高亮按钮" << "农历控件" << "游动的鱼" << "手机通讯录";listName << "环形图表" << "多边形状" << "光晕日历" << "蜘蛛网图" << "垂直时间轴"<< "自定义飞镖盘" << "任务策略表格";listName << "进度标尺" << "颜色面板" << "图片轮播" << "图片时钟" << "描点跟随"<< "水波效果" << "范围选择条" << "飞控套件";addItem("精美控件", listName);QString item = listItem.join(",");ui->navListView->setItems(item);this->setWindowTitle("Qt自定义控件大全 V2023 (QQ: 517216493 WX: feiyangqingyun)");ui->navListView->setCurrentRow(0);
}void frmExamplesSimple::addItem(const QString &parentName, const QStringList &childNames)
{//设置节点数据格式: 标题|父节点标题(父节点为空)|是否展开(0展开)|提示信息|左侧图标int count = childNames.count();listItem << QString("%1||0|%2|").arg(parentName).arg(count);for (int i = 0; i < count; ++i) {listItem << QString("%1. %2|%3|1||0xf0da").arg(i + 1, 2, 10, QChar('0')).arg(childNames.at(i)).arg(parentName);}
}void frmExamplesSimple::pressed(const QString &childText, const QString &parentText)
{//如果带了 . 表示序号,要删除再比较QString text = childText;if (text.contains(".")) {text = text.mid(text.indexOf(".") + 2, text.length());}int index = listName.indexOf(text);if (index >= 0) {ui->stackedWidget->setCurrentIndex(index);}
}

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

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

相关文章

chatgpt赋能python:如何通过Python赚钱

如何通过Python赚钱 介绍 Python是一种高级编程语言&#xff0c;广泛用于Web开发、数据分析、机器学习等领域。Python具有简单易学、功能强大、易于维护等特点&#xff0c;因此非常受欢迎。而且&#xff0c;Python开源免费&#xff0c;可以在各个平台上运行&#xff0c;不需要…

CH543乐得瑞单C口显示器方案(LDR6020)

首先显示器的种类很多&#xff0c;有桌面显示器&#xff0c;便携显示器&#xff0c;智能显示器&#xff0c;甚至AR眼镜也可以算是一个微型显示器。以往的显示器传输视频信号多为VGA和HDMI,当然DP也有&#xff0c;只是占少数&#xff0c;再早之前还有模拟信号接口等等&#xff0…

第4章 信息系统管理

文章目录 4.1.1 管理基础1 层次结构2 系统管理 4.1.2 规划和组织1 规划模型2 组织模型1&#xff09;业务战略&#xff08;竞争力优势模型&#xff1a;差异化、总成本领先、专注 战略&#xff09;2&#xff09;组织机制战略&#xff08;莱维特钻石模型&#xff1a;信息与控制、人…

进程间通信之共享内存

一、共享内存实现进程间通信的原理 共享内存实际是操作系统在实际物理内存中开辟的一段内存。 共享内存实现进程间通信&#xff0c;是操作系统在实际物理内存开辟一块空间&#xff0c;一个进程在自己的页表中&#xff0c;将该空间和进程地址空间上的共享区的一块地址空间形成…

数字孪生场景渲染能力中的WebGL技术路线

使用三维建模技术构建出的虚拟现实场景后&#xff0c;需要通过渲染引擎实现场景的高精度、高保真和实时渲染。同时&#xff0c;需要将现实场景中的数据信息融合到虚拟场景中&#xff0c;实现对现实情况的监测和控制。 目前大多数数字孪生城市项目在三维渲染引擎的技术选型上通…

测试工程师首chatGPT,编写python读取xmind测试用例chatgtp+python+xmind

背景 有用xmind写测试用例的吧&#xff0c;统计一个xmind的条&#xff0c;需要花大量的时间&#xff0c;还有要统计有多少条冒烟的&#xff0c;多少条不通过的&#xff0c;还有通过的条数。 需求 快速使用python&#xff0c;写一个简单的脚本&#xff0c;统计所有xmind节点&…

c++ 内存管理一:初识内存分配工具

文章目录 前言1 new 和 delete2 new[]和delete[]3 operator new4 placement new5 malloc和free6 allocator 前言 侯捷 c内存管理学习总结笔记。 在C中&#xff0c;有几种常用的内存分配工具可以帮助进行动态内存管理。 从c应用程序自上而下&#xff0c;通常会有这样的几种分配…

算法分析基础题目

第一章-算法概述 递归算法必须具备的两个条件是边界条件或停止条件和递推方程或递归方程冒泡排序时间复杂度是___&#xff0c;堆排序时间复杂度是___。 O ( n 2 ) O(n^2) O(n2), O ( n l o g n ) O(nlogn) O(nlogn)斐波那契数列的第1项为1&#xff0c;第2项为2&#xff0c;以…

[RocketMQ] Producer发送消息的总体流程 (七)

单向发送: 把消息发向Broker服务器, 不管Broker是否接收, 只管发, 不管结果。同步发送: 把消息发向Broker服务器, 如果Broker成功接收, 可以得到Broker的响应。异步发送: 把消息发向Broker服务器, 如果Broker成功接收, 可以得到Broker的响应。异步所以发送消息后, 不用等待, 等…

LLaMA模型微调版本:斯坦福 Alpaca 详解

项目代码&#xff1a;https://github.com/tatsu-lab/stanford_alpaca 博客介绍&#xff1a;https://crfm.stanford.edu/2023/03/13/alpaca.html Alpaca 总览 Alpaca 是 LLaMA-7B 的微调版本&#xff0c;使用Self-instruct[2]方式借用text-davinct-003构建了52K的数据&#x…

vue3框架开发uniapp高仿度小满金融App项目

vue3框架开发uniapp高仿度小满金融App项目 心血来潮写了度小满前端项目使用vue3开发地址&#xff1a;度小满金融 下面是实现效果

第一次安装cocoapods经历

先是执行&#xff1a;sudo gem install cocoapods 报错&#xff1a; ERROR: Error installing cocoapods: The last version of activesupport (> 5.0, < 8) to support your Ruby & RubyGems was 6.1.7.3. Try installing it with gem install activesupport -v…