一、前言

这个控件是近期定制的控件,还是比较实用的控件之一,用户主要是提了三点需求,一点是切换焦点的时候控件放大突出显示,一点是可直接输入或者编辑值,还有一点是支持上下键及翻页键和鼠标滚轮来动态修改值,类似于qspinbox控件。要能够支持直接输入首先想到的就是qlineedit控件,在原有的仪表盘控件上中间部分,放置一个qlineedit控件用来输入值,采用正则表达式来限制只能输入数字,为了使得qlinedit和自定义绘制的仪表盘完全融为一体,必须设置qlineedit的样式为背景透明,至于输入框的位置,有个小技巧就是直接将输入框设置为控件的大小,这样输入的焦点永远在控件的中间,完全混合,丝毫看不出是一个输入框控件插在那里,至于上下键及翻页键和鼠标滚轮,直接安装事件过滤器即可识别到,进行对应的处理即可。

二、实现的功能

* 1:可设置范围值,支持负数值

* 2:可设置开始旋转角度/结束旋转角度

* 3:可设置是否启用动画效果以及动画效果每次移动的步长

* 4:可设置外圆背景/内圆背景/进度颜色/空余颜色/文字颜色

* 5:自适应窗体拉伸,文字自动缩放

* 6:支持tab及鼠标按下切换焦点

* 7:支持直接输入值立即应用

* 8:获取焦点控件自动变大

* 9:支持键盘上下键步长为1修改值

* 10:支持上下翻页键步长为10修改值

* 11:支持鼠标滚轮步长为1修改值

三、效果图

五、核心代码

void GaugeEdit::paintEvent(QPaintEvent *){ int width = this->width(); int height = this->height(); int side = qMin(width, height); //绘制准备工作,启用反锯齿,平移坐标轴中心,等比例缩放 QPainter painter(this); painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); painter.translate(width / 2, height / 2); painter.scale(side / 200.0, side / 200.0); //绘制外圆 drawOuterCircle(&painter); //绘制内圆 drawInnerCircle(&painter); //绘制当前进度 drawProgress(&painter); //绘制中心圆 drawCenterCircle(&painter); //绘制单位 drawUnit(&painter);}void GaugeEdit::drawOuterCircle(QPainter *painter){ int radius = 91 + offset; painter->save(); painter->setPen(Qt::NoPen); painter->setBrush(outerCircleColor); painter->drawEllipse(-radius, -radius, radius * 2, radius * 2); painter->restore();}void GaugeEdit::drawInnerCircle(QPainter *painter){ int radius = 80 + offset; painter->save(); painter->setPen(Qt::NoPen); painter->setBrush(innerCircleColor); painter->drawEllipse(-radius, -radius, radius * 2, radius * 2); painter->restore();}void GaugeEdit::drawProgress(QPainter *painter){ int radius = 75 + offset; painter->save(); painter->setPen(Qt::NoPen); QRectF rect(-radius, -radius, radius * 2, radius * 2); //计算总范围角度,当前值范围角度,剩余值范围角度 double angleAll = 360.0 - startAngle - endAngle; double angleCurrent = angleAll * ((currentValue - minValue) / (maxValue - minValue)); double angleOther = angleAll - angleCurrent; //绘制当前值饼圆 painter->setBrush(usedColor); painter->drawPie(rect, (270 - startAngle - angleCurrent) * 16, angleCurrent * 16); //绘制剩余值饼圆 painter->setBrush(freeColor); painter->drawPie(rect, (270 - startAngle - angleCurrent - angleOther) * 16, angleOther * 16); painter->restore();}void GaugeEdit::drawCenterCircle(QPainter *painter){ int radius = 60 + offset; painter->save(); painter->setPen(Qt::NoPen); painter->setBrush(centerCircleColor); painter->drawEllipse(-radius, -radius, radius * 2, radius * 2); painter->restore();}void GaugeEdit::drawUnit(QPainter *painter){ int radius = 100; painter->save(); painter->setPen(textColor); QFont font; font.setPixelSize(30); painter->setFont(font); int offsetY = 110; QRectF unitRect(-radius, -radius + offsetY, radius * 2, radius * 2 - offsetY); painter->drawText(unitRect, Qt::AlignCenter, unit); painter->restore();}

六、控件介绍

1. 超过150个精美控件,涵盖了各种仪表盘、进度条、进度球、指南针、曲线图、标尺、温度计、导航条、导航栏,flatui、高亮按钮、滑动选择器、农历等。远超qwt集成的控件数量。

2. 每个类都可以独立成一个单独的控件,零耦合,每个控件一个头文件和一个实现文件,不依赖其他文件,方便单个控件以源码形式集成到项目中,较少代码量。qwt的控件类环环相扣,高度耦合,想要使用其中一个控件,必须包含所有的代码。

3. 全部纯Qt编写,QWidget+QPainter绘制,支持Qt4.6到Qt5.12的任何Qt版本,支持mingw、msvc、gcc等编译器,支持任意操作系统比如windows+linux+mac+嵌入式linux等,不乱码,可直接集成到Qt Creator中,和自带的控件一样使用,大部分效果只要设置几个属性即可,极为方便。

4. 每个控件都有一个对应的单独的包含该控件源码的DEMO,方便参考使用。同时还提供一个所有控件使用的集成的DEMO。

5. 每个控件的源代码都有详细中文注释,都按照统一设计规范编写,方便学习自定义控件的编写。

6. 每个控件默认配色和demo对应的配色都非常精美。

7. 超过130个可见控件,6个不可见控件。

8. 部分控件提供多种样式风格选择,多种指示器样式选择。

9. 所有控件自适应窗体拉伸变化。

10. 集成自定义控件属性设计器,支持拖曳设计,所见即所得,支持导入导出xml格式。

11. 自带activex控件demo,所有控件可以直接运行在ie浏览器中。

12. 集成fontawesome图形字体+阿里巴巴iconfont收藏的几百个图形字体,享受图形字体带来的乐趣。

13. 所有控件最后生成一个动态库文件(dll或者so等),可以直接集成到qtcreator中拖曳设计使用。

14. 目前已经有qml版本,后期会考虑出pyqt版本,如果用户需求量很大的话。

15. 自定义控件插件开放动态库使用(永久免费),无任何后门和限制,请放心使用。

16. 目前已提供26个版本的dll,其中包括了qt5.12.3 msvc2017 32+64 mingw 32+64 的。

17. 不定期增加控件和完善控件,不定期更新SDK,欢迎各位提出建议,谢谢!

18. Qt入门书籍推荐霍亚飞的《Qt Creator快速入门》《Qt5编程入门》,Qt进阶书籍推荐官方的《C++ GUI Qt4编程》。

19. 强烈推荐程序员自我修养和规划系列书《大话程序员》《程序员的成长课》《解忧程序员》,受益匪浅,受益终生!

qlineedit只能输入数字_Qt编写自定义控件51-可输入仪表盘相关推荐

  1. 3指南针旋转_Qt编写自定义控件6-指南针仪表盘

    前言 指南针仪表盘,主要用来指示东南西北四个方位,双向对称两个指针旋转,其实就是360度打转,功能属于简单型,可能指针的绘制稍微难一点,需要计算多个点构成多边形,本系列控件文章将会连续发100+篇,一 ...

  2. java异常练习:要求用户输入数字,捕获并处理用户输入错误的异常,给用户进行提示

    java异常练习:要求用户输入数字,捕获并处理用户输入错误的异常,给用户进行提示 参考文章: (1)java异常练习:要求用户输入数字,捕获并处理用户输入错误的异常,给用户进行提示 (2)https: ...

  3. python获取输入数字_python获取从命令行输入数字的方法

    本文实例讲述了python获取从命令行输入数字的方法.分享给大家供大家参考.具体如下: #---------------------------------------- # Name: numeri ...

  4. python从键盘获取输入数字_python获取从命令行输入数字的方法

    本文实例讲述了python获取从命令行输入数字的方法.分享给大家供大家参考.具体如下: #---------------------------------------- # Name: numeri ...

  5. 用pyth写一个代码输入数字到列表中,直到输入空值为止 ,依次将每个数字的最大数挑出来,生成一个新的列表...

    这是一个 Python 代码示例,实现了你所描述的功能: numbers =[] while True:num = input("请输入数字,输入空值结束: ")if num == ...

  6. java 输入数字到数组_java怎么实现输入n个数字赋值到一个数组内?

    展开全部 数组的长度是固定的62616964757a686964616fe4b893e5b19e31333365646239,这是肯定的,那就知道定义一个长度,不如是10,你循环输入,每次在循环里面检 ...

  7. qt qss设置字体大小_Qt编写自定义控件70-扁平化flatui

    一.前言 对于现在做前端开发人员来说,FlatUI肯定不陌生,最近几年扁平化的设计越来越流行,大概由于现在PC端和移动端的设备的分辨率越来越高,扁平化反而看起来更让人愉悦,而通过渐变色产生的质感色彩反 ...

  8. qt获取当前系统音量值_Qt编写自定义控件50-迷你仪表盘

    一.前言 这个控件取名叫迷你仪表盘,是以为该控件可以缩小到很小很小的区域显示,非常适合小面积区域展示仪表数据使用,还可以手动触摸调节进度,是我个人觉得最漂亮小巧的一个控件.初次看到类似的控件是在一个音 ...

  9. 轮播高度_Qt编写自定义控件24-图片轮播控件

    一.前言 上一篇文章写的广告轮播控件,采用的传统widget堆积设置样式表做的,这次必须要用到更高级的QPainter来绘制了,这个才是最高效的办法,本控件参考雨田哥的轮播控件,经过大规模的改造而成, ...

最新文章

  1. android post json格式,Android中post请求传递json数据给服务端的实例
  2. linux服务器mysql数据库新建数据库并配置数据库用户
  3. 【虚拟化】docker安装ElasticSearch+Kibana,下载IK分词器
  4. AAAI2019 | 腾讯AI Lab详解自然语言处理领域三大研究方向及入选论文
  5. java缓冲输入流_java _io_字符缓冲流的输入、输出
  6. PAT 1009 说反话
  7. 2017年国内开源镜像站点汇总 1
  8. leetcode讲解--169. Majority Element
  9. 5月首批国产游戏版号下发:又一大波游戏要来了
  10. 分析了 Stack Overflow、Reddit 等 9 个榜单,Python 第一的地位稳了!
  11. mysql数据库相关操作
  12. 易筋SpringBoot 2.1 | 第三篇:RestTemplate请求HTTP(1)
  13. android手机设置固定dns,(图文)安卓手机修改WiFi DNS设置的方法
  14. c语言-网吧管理系统
  15. Jmeter常用断言之响应断言详解
  16. 让宝宝长高的四大要素
  17. 复旦大学计算机科学技术学院院长姜育刚:人工智能算法治理|达观WAIC回顾
  18. 【数学建模】基于matlab模拟疫情SEIRS模型【含Matlab源码 2214期】
  19. JavaFlink系列之一:Maven程序搭建及Java入门案例多种写法
  20. MSRA被曝停招国防七子及北邮学生!

热门文章

  1. php 编译 iconv错误,php编译错误:configure: error: Please reinstall the iconv library.
  2. vue 跳添加编辑页面传两个值_vuecli3开发多页面项目
  3. 动态规划—最长上升子序列(POJ 1458)
  4. 分布式架构在农业银行的应用实践与展望
  5. 一次事故,我对MySQL时间戳存char(10)还是int(10)有了全新的认识
  6. 技术实践丨Prometheus+Grafana搭建HBase监控仪表盘
  7. 划重点!DWS开发的五大要点
  8. 技术实操丨HBase 2.X版本的元数据修复及一种数据迁移方式
  9. 【华为云技术分享】Batch Normalization (BN) 介绍
  10. 【我的物联网成长记12】当物联网遇上边缘计算