一、前言

无论是哪一门开发框架,如果涉及到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);
}
}

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

  1. WPF自定义控件与样式(8)-ComboBox与自定义多选控件MultComboBox

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: 下拉选 ...

  2. 【转】WPF自定义控件与样式(8)-ComboBox与自定义多选控件MultComboBox

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等. 本文主要内容: 下拉选择控件ComboBox的自定义样式及扩展: 自定义多选控件Mul ...

  3. Qt编写控件属性设计器2-拖曳控件

    一.前言 上一篇文章把插件加载好了,并且把插件中的所有控件都显示到了列表框中,这次要做的就是实现拖曳控件的功能,用户选择一个控件拖曳到画布上,松开,在松开位置处自动实例化该控件,这个需要用到dropE ...

  4. Android自定义控件1--自定义控件介绍

    Android控件基本介绍 Android本身提供了很多控件比如我们常用的有文本控件TextView和EditText:按钮控件Button和ImageButton状态开关按钮ToggleButton ...

  5. Windows phone 自定义控件(无外观控件)——ColorPicker

    编码前 在上一篇博客中,写的是一个UserControl的子类,它具有固定的外观(虽然也可以通过样式来进行修改,但受到的限制很大).如果你想要使用这个控件的逻辑,但是希望在使用的时候可以更改控件的外观 ...

  6. 微人事 star 数超 10k,如何打造一个 star 数超 10k 的开源项目

    看了下,微人事(https://github.com/lenve/vhr)项目 star 数超 10k 啦,松哥第一个 star 数过万的开源项目就这样诞生了. 两年前差不多就是现在这个时候,松哥所在 ...

  7. WPF自定义控件与样式(9)-树控件TreeView与菜单Menu-ContextMenu

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: 菜单M ...

  8. WPF自定义控件与样式(10)-进度控件ProcessBar自定义样

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: Pro ...

  9. WPF自定义控件与样式(11)-等待/忙/正在加载状态-控件实现

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要有三种实现方式 ...

  10. 自定义控件和XControl控件

    (1)LabVIEW的自定义控件,实际上就是对LabVIEW自带的控件的一种修改,但是这种修改只能改变它的外观,即大小.颜色.位置等等,但是功能是改变不了的.如你对一个按钮进行自定义控件,无论怎么改, ...

随机推荐

  1. JDBC后端实现查询功能逻辑

    // 包名 package com.zhulx.JDBC; // 导入实例类 import com.zhulx.pojo.Account; import java.sql.*; import java ...

  2. Android复习(五)设备兼容—>支持刘海屏

    支持刘海屏 刘海屏是指某些设备显示屏上的一个区域延伸到显示面,这样既能为用户提供全面屏体验,又能为设备正面的重要传感器留出空间.Android 在搭载 Android 9(API 级别 28)及更高版 ...

  3. 通过自定义字符串内插处理程序(InterpolatedStringHandler)和CallerArgumentExpression特性来实现一个好玩的场景

    背景知识介绍 什么是自定义字符串内插处理程序? 简单来讲就是自定义一个高性能的字符串拼接程序 通过 $"{a}{b}"的方式. 什么是CallerArgumentExpressio ...

  4. 云原生周刊:Docker 推出 Docker Build Cloud

    开源项目推荐 Kube-Vip Kube-Vip 旨在为 Kubernetes 集群提供高可用性和负载均衡功能.它提供了一个可插拔的 VIP(虚拟 IP)管理器,可以为集群中的服务分配一个虚拟 IP ...

  5. Tomcat线程池详解,为什么SpringBoot最大支持200并发?

    Q:经典面试题,SpringBoot 应用可以同时并发处理多少请求? A:SpringBoot 应用并发处理请求数主要由两个因素影响,使用的 Servlet容器(默认使用 Tomcat,常用的还有 j ...

  6. FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频

    ​ijkplayer是Bilibili公司(简称B站)基于FFmpeg3.4研发并开源的国产播放器,它可运行于Android和iOS系统,既支持播放本地视频文件,也支持播放网络上的流媒体链接. 之前的 ...

  7. Kubernetes集群证书过期解决方案:使用kubeadm为证书续期

    目录 一.系统环境 二.前言 三.Kubernetes证书过期及续期简介 四.使用kubeadm为Kubernetes集群证书续期 4.1 查看k8s集群证书过期时间 4.2 为master节点续期证 ...

  8. normal matrix 正规矩阵

    资料来源 In mathematics, a complex square matrix A is normal if   满足此条件也意味着A可对角化. 所以,厄米矩阵和幺正矩阵都是正规矩阵.

  9. Webshell流量分析之哥斯拉Godzilla&冰蝎Behinder

    目录 哥斯拉 冰蝎 哥斯拉和冰蝎相较于菜刀蚁剑,它们的通信流量是加密的,有比较好的抗检测能力. 菜刀和蚁剑流量分析:Webshell流量分析之菜刀Chopper&蚁剑AntSword 哥斯拉 ...

  10. XSS跨站脚本之portswigger labs练习

    目录 1 什么是XSS 2 XSS的类型有哪些 3 XSS攻击的过程和原理 4 XSS的防御 5 可能会用到的XSS Payload资源 6 靶场训练 portswigger labs 6.1 没有任 ...