一、前言

这个控件没有太多的应用场景,主要就是练手,论美观的话比不上之前发过的一个图片时钟控件,所以此控件也是作为一个基础的绘制demo出现在Qt源码中,我们可以在Qt的安装目录下找到一个时钟控件的绘制,甚至还有qml版本,本控件无非就是一个仪表边框加上时钟分钟刻度再加上时分秒指针,打完收工,我是在此基础上增加了可以设置各种颜色,然后鼠标右键可设置四种效果 普通效果/弹簧效果/连续效果/隐藏效果,弹簧效果的意思是秒钟走动的时候,先移动到超过指定位置,然后又重新弹回来,连续效果的意思是将步长减少,一点点的移动,将秒钟的定时器精度调高。还有一个新增的功能是内置了设置系统时间公共槽函数,支持任意操作系统。

二、实现的功能

* 1:可设置边框颜色

* 2:可设置前景色背景色

* 3:可设置时钟分钟秒钟指针颜色

* 4:可设置刷新间隔

* 5:鼠标右键可设置四种效果 普通效果/弹簧效果/连续效果/隐藏效果

* 6:增加设置系统时间公共槽函数,支持任意操作系统

三、效果图

五、核心代码

void GaugeClock::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); //绘制外边框 drawCrown(&painter); //绘制背景 drawBg(&painter); //绘制刻度线 drawScale(&painter); //绘制刻度值 drawScaleNum(&painter); //绘制时钟指针 drawHour(&painter); //绘制分钟指针 drawMin(&painter); //绘制秒钟指针 drawSec(&painter); //绘制中心盖板 drawDot(&painter);}void GaugeClock::drawCrown(QPainter *painter){ int radius = 99; painter->save(); painter->setPen(Qt::NoPen); QLinearGradient crownGradient(0, -radius, 0, radius); crownGradient.setColorAt(0, crownColorStart); crownGradient.setColorAt(1, crownColorEnd); painter->setBrush(crownGradient); painter->drawEllipse(-radius, -radius, radius * 2, radius * 2); painter->restore();}void GaugeClock::drawBg(QPainter *painter){ int radius = 92; painter->save(); painter->setPen(Qt::NoPen); painter->setBrush(background); painter->drawEllipse(-radius, -radius, radius * 2, radius * 2); painter->restore();}void GaugeClock::drawScale(QPainter *painter){ int radius = 90; painter->save(); QPen pen; pen.setColor(foreground); pen.setCapStyle(Qt::RoundCap); for (int i = 0; i <= 60; i++) { if (i % 5 == 0) { pen.setWidthF(1.5); painter->setPen(pen); painter->drawLine(0, radius - 10, 0, radius); } else { pen.setWidthF(0.5); painter->setPen(pen); painter->drawLine(0, radius - 5, 0, radius); } painter->rotate(6); } painter->restore();}void GaugeClock::drawScaleNum(QPainter *painter){ int radius = 70; painter->save(); painter->setPen(foreground); double startRad = 60 * (M_PI / 180); double deltaRad = 30 * (M_PI / 180); for (int i = 0; i < 12; i++) { double sina = qSin(startRad - i * deltaRad); double cosa = qCos(startRad - i * deltaRad); QString strValue = QString("%1").arg(i + 1); double textWidth = fontMetrics().width(strValue); double textHeight = fontMetrics().height(); int x = radius * cosa - textWidth / 2; int y = -radius * sina + textHeight / 4; painter->drawText(x, y, strValue); } painter->restore();}void GaugeClock::drawHour(QPainter *painter){ painter->save(); //设置画笔平滑圆角 QPen pen; pen.setCapStyle(Qt::RoundCap); painter->setPen(pointerHourColor); painter->setBrush(pointerHourColor); QPolygon pts; pts.setPoints(4, -3, 8, 3, 8, 2, -40, -2, -40);  painter->rotate(30.0 * ((hour + min / 60.0)));  painter->drawConvexPolygon(pts); painter->restore();}void GaugeClock::drawMin(QPainter *painter){ painter->save(); //设置画笔平滑圆角 QPen pen; pen.setCapStyle(Qt::RoundCap); painter->setPen(pointerMinColor); painter->setBrush(pointerMinColor); QPolygon pts; pts.setPoints(4, -2, 8, 2, 8, 1, -60, -1, -60); painter->rotate(6.0 * (min + sec / 60.0));  painter->drawConvexPolygon(pts); painter->restore();}void GaugeClock::drawSec(QPainter *painter){ if (secondStyle == SecondStyle_Hide) { return; } painter->save(); //设置画笔平滑圆角 QPen pen; pen.setCapStyle(Qt::RoundCap); painter->setPen(pointerSecColor); painter->setBrush(pointerSecColor); QPolygon pts; pts.setPoints(3, -1, 10, 1, 10, 0, -70); painter->rotate(angleSpring); painter->drawConvexPolygon(pts); painter->restore();}void GaugeClock::drawDot(QPainter *painter){ painter->save(); QConicalGradient coneGradient(0, 0, -90.0); coneGradient.setColorAt(0.0, background); coneGradient.setColorAt(0.5, foreground); coneGradient.setColorAt(1.0, background); painter->setOpacity(0.9); painter->setPen(Qt::NoPen); painter->setBrush(coneGradient); painter->drawEllipse(-5, -5, 10, 10); painter->restore();}void GaugeClock::doAction(){ QAction *action = (QAction *)sender(); QString str = action->text(); if (str == "弹簧效果") { action->setText("连续效果"); setSecondStyle(SecondStyle_Spring); } else if (str == "连续效果") { action->setText("隐藏效果"); setSecondStyle(SecondStyle_Continue); } else if (str == "隐藏效果") { action->setText("普通效果"); setSecondStyle(SecondStyle_Hide); } else if (str == "普通效果") { action->setText("弹簧效果"); setSecondStyle(SecondStyle_Normal); }}

六、控件介绍

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

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

3. 全部纯Qt编写,QWidget+QPainter绘制,支持Qt4.6到Qt5.13的任何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. 强烈推荐程序员自我修养和规划系列书《大话程序员》《程序员的成长课》《解忧程序员》,受益匪浅,受益终生!

qml 时间控件_Qt编写自定义控件54-时钟仪表盘相关推荐

  1. qml 时间控件_Qt6官方最新消息:桌面样式Qt quick Controls 2支持大多控件,委托更少,运行更流畅...

    Qt是一个跨平台框架,通常用作图形工具包,它不仅创建CLI应用程序中非常有用.而且它也可以在三种主要的台式机操作系统以及移动操作系统(如Symbian,Nokia Belle,Meego Harmat ...

  2. qt文件选择控件_Qt编写的项目作品2-控件属性设计器(组态)

    一.功能特点 自动加载插件文件中的所有控件生成列表,默认自带的控件超过120个. 拖曳到画布自动生成对应的控件,所见即所得. 右侧中文属性栏,改变对应的属性立即应用到对应选中控件,直观简洁,非常适合小 ...

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

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

  4. qt动画效果_Qt编写自定义控件44-天气仪表盘

    一.前言 天气仪表盘控件是所有控件中唯一一个使用了svg矢量图的控件,各种天气图标采用的矢量图,颜色变换采用动态载入svg的内容更改生成的,其实也可以采用图形字体来做,本次控件为了熟悉下svg在Qt中 ...

  5. qlineedit只能输入数字_Qt编写自定义控件51-可输入仪表盘

    一.前言 这个控件是近期定制的控件,还是比较实用的控件之一,用户主要是提了三点需求,一点是切换焦点的时候控件放大突出显示,一点是可直接输入或者编辑值,还有一点是支持上下键及翻页键和鼠标滚轮来动态修改值 ...

  6. h5 时间控件问题,怎么设置type =datetime-local 的值

    在js中设置自定义时间到date控件的方法: 1.在html5中定义时间控件 <input type="date" id="datePicker" val ...

  7. VB6.0中,DTPicker日期、时间控件不允许为空时,采用文本框与日期、时间控件相互替换赋值(解决方案)...

    VB6.0中,日期.时间控件不允许为空时,采用文本框与日期.时间控件相互替换赋值,或许是一个不错的选择. 实现效果如下图: 文本框txtStopTime1 时间框DTStopTime1(DTPicke ...

  8. android 继承现有控件,Android继承现有控件拓展实现自定义控件textView

    通常情况下,Android实现自定义控件无非三种方式. Ⅰ.继承现有控件,对其控件的功能进行拓展. Ⅱ.将现有控件进行组合,实现功能更加强大控件. Ⅲ.重写View实现全新的控件 本文重点讨论继承现有 ...

  9. Appium 关于 swipe 滑动时间控件选择时间问题,swipe 滑动没效果,用 TouchAction代替

    一开始一直想用 swipe 进行滑动去操作滑动时间控件,选择时间. 后来尝试了几次后也没有滑动效果出现,各种百度搜索也找不到解决办法. 于是就采取了 TouchAction 方法,真机可以用开发者选项 ...

最新文章

  1. 几个清华和哈工大学霸的公众号,值得学习!
  2. tf.keras.losses.BinaryCrossentropy 损失函数 示例
  3. SAP WM LQ02 为供应商寄售库存去K的时候,如果有Open TO单,则不能成功为物料去K?
  4. 常见的HTML5面试题(附答案)
  5. 打通C/4HANA和S/4HANA的一个原型开发:智能服务创新案例
  6. mybatis 时间_开发工具:Mybatis.Plus.插件三种方式的逆向工程
  7. 通过netstat+rmsock查找AIX端口对应进程
  8. 编写一个爬虫类库——(一)想法
  9. Undefined Reference to Typeinfo
  10. 机器学习-集成学习:随机森林(Random Forest)
  11. restful xml_使用入站适配器公开HTTP Restful API。 第1部分(XML)
  12. AIDL 发生异常的原因 Android java.lang.SecurityException: Binder invocation to an incorrect interface...
  13. 猎豹网校 java,猎豹网校JAVA编程思想高级视频教程
  14. SPP、RFB和ASPP
  15. Win7 突然没声音 无法播放测试音调
  16. matlab2020a安装完多大_Matlab2020a
  17. MySQL数据库学习笔记2
  18. 如何从VDS明网下载钱包
  19. 无驱、代码自动植入:新一代软件保护锁——圣天诺LDK-HL
  20. 免费的 PPT 模版资源

热门文章

  1. Spark之RDD实战篇3
  2. java 内部类and匿名类
  3. 虚拟机中安装win7
  4. php自定义目录,ThinkPHP中自定义目录结构的设置方法_php技巧
  5. 中文linux最小,35M的中文linux硬盘简单安装方法Live-CD:SliTaz.tw-全世界最小的li
  6. json转excel_手写JAVA实现个性化业务的Excel转JSON,效率提高99.99%
  7. 微信开发者工具(deepin linux 还是建议使用deppin深度商店安装此软件)
  8. poi读取excel导入mysql_poi读取xlsx表格内容并插入到mysql中,OutOfMemoryError
  9. 直接用自己服务器做图床可以吗_用个人服务器搭建图床
  10. java跑批任务_【spring配置】——spring整合Quartz定时器