#include <QWidget>        // QWideet,类是所有用户界面对象的基类
#include<QPaintEvent>     // QPaintEivet,类包含绘制事件的事件参数。
#include <QPainter>       // QPainter 类在小部件和其他绘画设备上执行低级绘画
#include <QPen>           // QPen类定义了0Painter应该如何绘制开状的线条和轮廓。
#include <QBrush>         // brus类定义了QPainter 绘制的形状的填充模式
#include <QtMath>         // 这些函数是C或标准模板库中不可用的基本数学运算的部分方便定义
#include <QTimer>         // QTimer, 类提供重夏和单次计时器。
#include <QDebug>         // QDebug,类为调试信息提供输出流。

绘制表盘

首先我们要确定绘制表盘需要哪些参数,半径和Π?按照数学的逻辑来说确实没错,不过把它运用到计算机中还是需要有所改变才可以,表盘的制作需要用到void QPainter::drawEllipse(int x, int y, int width, int height)这个函数,这是一个过载功能。以给定的宽度和高度绘制由从 (x, y) 开始的矩形定义的椭圆。

绘制刻度盘

绘制刻度盘我们需要知道每次转动的角度是多少,时钟有12个大的刻度,每个大的刻度有5个小刻度,所有秒钟每秒转动的角度为360/60 = 6°。圆心所在竖线上方向为y轴正半轴,0°参考点为x轴正半轴,顺时针旋转。从12点处开始绘制,那么我们的基础仰角就是90° * 3 = 270°,接下来依次是276°、282°。

绘制指针

时钟的指针分为时针、分针和秒针,原理基本上一模一样, 时针我们将其看作是一个等腰三角形,底边在中心指针圆域中,顶点指向刻度,所以我们需要知道三个点的坐标才可以绘制出时针(三角形)。

流程

首先我们分别通过

QTime::currentTime.hour

QTime::currentTime.minute

QTime::currentTime.second

获取系统的时、分、秒然后再把值赋给Hs、Ms、Ss,如何实时更新时间呢?我们需要一个定时器QTimer值设为1000,表示每间隔1秒返回一次系统时间。

直接上代码!

头文件定义

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPaintEvent>
#include <QPainter>
#include <QPen>
#include <QBrush>
#include <QtMath>
#include <QTimer>#define Pai 3.14
class Widget : public QWidget{Q_OBJECT
public:Widget(QWidget parent = 0);~Widget();void paintEvent(QpaintEvent *);    //重写绘制事件函数void Init_Parameter();             //初始化参数函教void Draw_Clock(QPainter *);       //绘制时钟void Draw_Dial(QPainter *);        //绘制刻度盘void Draw_Text(QPainter *);        //绘制刻度值void Draw_Pointer(QPainter *);     //绘制指针
private:QTimer timer;         //定时器QPoint Center_pos;    //时钟圆心坐标int R_Edge;           //外圆半径int R_Inside;         //内圆半径int R_Center;         //中心小圆半径int R_Pointer;        //中心指针圆半径int Div_Max = 12;     //大刻度值int Div_Min = 5;      //小刻度值float BaseAngle = 270;//仰角int Hs;               //时int Ms;               //分int Ss;               //秒
};
#endif 

.cpp文件

#include "widget.h"
#include <QTime>
#Include <QDebug>Widget.Widget(Qwidget"parent):QWidgetlparent)
{timer = new QTimer(this);connect(timer,SIGNAL(timeout()),this,SLOT(update()));//定时调用绘制事件函教timer->start(1000);//开启定时器widget::~Widget()
}void Widget::paintEvent(QpaintEvent *)
{QPainter painter(this);paintersetRenderHint(QPainter::Antialiasing);//设置抗锯齿Draw_Clock( &painter);painter.drawEllipse(Center_pos,R_Edge,R_Edge);
}void Widget::Draw_Clock(QPainter*painter)//绘制时钟(刻度盘、刻度值、指针)
{lnit_Parameter();Draw_Dial(painter);Draw_Text(painter);Draw_Pointer(painter);
}void Widget::lnit_Parameter()Center_pos = QPoint(this->width()/2,this->height()/2);R_Edge = this->height()/2;R_Inside = R_Edge-10;R_Center= 15;R_Pointer = 6;QTime Time = QTime::currentTime();//获取当前系统时间Hs=Time.hour();Ms=Time.minute();S-Time.second();
}void Widget::Draw_Dial(QPainter *painter)
{painter->save();for(int Loop = O; Loop <= Div_Max * Div_Min;Loop++){float Angle= BassAngle + (360 / (Div_Max * Div_Min))*Loop;int R= R_Inside - 1;int x_start = Center_pos.x()+ R * cos((Angle / 180) * Pai);int y_start = Center_pos.y()+ R * sin((Angle / 180) * Pai);if(Loop % Div_Min == O)//判断大小刻度{QPen pen(Qt::black);pen.stWidth(2);painter->setPen(pen);R=R_lnside-20;}else{QPen pen(Qt::black);pen.setWidth(2);painter->setPen(pen);R=R_Inside-15;}int x_end = Center_pos.x()+R * cos((Angle / 180) * Pai);int y_end = Center_pos.y()+R * sin((Angle / 180) * Pai);painter->drawlLinel(Qpoint(x_start,y_start),QPoint(x_end,y_end));}   painter->restore();
}void Widget::Draw_Text(QPainter *painter)
{painter->save();QPen qPen(Qt::black);qPen.setwidt(2);painter->setPen(qPen);QFont qFont("楷体",14,QFont: Bold,false);painter->setFont(qFont);int Dial_Text = 12;for(int Loop = 0;Loop < Div_Max;Loop++){if(Dial_Text > 12)Dial_Text = 1;intR = R_Inside - 60;float Angle = BaseAngle + (360 / Div_Max ) * Loop;int x = Center_pos.x()+R * cos((Angle / 180) * Pai);int y = Center_pos.y()+R * sin((Angle / 180) * Pai);painter->drawText(QRect(x-20,y-20,80,80),Qstring::number(Dial_Text++));}        painter->restore();
}void Widget.::Draw_Pointer(QPaintsr*painter)
{painter->save();QBrush qBrush= QBrush/Qcolor(Qt::black));painter->seBrush(qBrush);QPen qPen(Qt:.black);qPen setwidtb(2);painter->setPen(qPen);//绘制秒针float Angle = BaseAngle + (360 / (Div_Max * Div_Min)) * Ss;float RightAngle = Angle + 90;float LeftAngle = Angle - 90;intR = R_Inside-1;int x_start = Center_pos.×() + R * cos((Angle / 180) * Pai);int y_start = Center_pos.y() + R * sin((Angle / 180) * Pai);R=R_Pointer-1;int x_end1 = Center_pos.×() + R * cos(RightAngle * 3.14 / 180);int y_end1 = Center_p0s.y() + R * sin(RightAngls * 3.14 / 180);int x_end2 = Center_pos.x() + R * cos(LeftAnge * 3.14 / 180);int y_end2 = Center_pos.y() + R * sin(LeftAngls * 3.14/ 180);QPointF aTriangle_S[3] ={QPoint(x_start,y_start),QPoint(x_end1,y_end1),QPoint(x_end2,y_end2)};painter->drawPolygon(qTriangle_s,3);//绘制分针Angle= BaseAngle+(360/ (Div_Max Div_Min))*Ms;RightAngle = Angle +90;LeftAnge= Angle - 90;R = R_Inside - 60;x_start = Center_pos.×()+R * cos((Angle / 180)*Pa);y_start = Center _pos.y()+R * sin((Angle / 180)*Pa);R = R_Pointer-1;x_end1 = Center_pos.×()+ R * cos(RightAngle* 3.14 / 180);y_end1 = Center_pos.y()+ R * sin(RightAngle* 3.14 / 180);x_end2 = Center_pos.×()+ R * cos(LeftAngle * 3.14 / 180);y_end2 = Center_pos.y()+ R * sin(LeftAngle *3.14 / 180);QPointF qTriangle_M[3]={QPoint(x_start,y_start),QPoint(x_end1,y_end1),QPoint(x_end2,y_end2)};painter->drawPolygon(qTriangle_M,3);
//绘制时针Angle = BassAngle+(360 / Div_Max) * Hs;RightAngle = Angle + 90;LeftAngle= Angle - 90;R = R_Inside-120;x_start = Center_pos.×()+R*cos((Angle / 180)*Pa);y_start = Center_pos.y()+R*sin((Angle / 180)* Pai);R=R_Pointer-1;x_end1 = Center_pos.x() + R*cos(RightAngle * 3.14 / 180);y_end1 = Center_pos.y() + R*sin(RightAngle * 3.14 / 180);x_end2 = Center_pos.x() + R*cos(LeftAnele * 3.14 / 180);y_end2 = Center_pos.y() + R*sin(LeftAngle *3.14/ 180);QPointF qTriangle_H[3] = {QPoint(x_start,y_start),QPoint(x_end1,y_end1),QPoint(x_end2,y_end2);painter->drawPolygon(qTriangle_H,3);painter->restore();
}

Qt界面开发之绘制时钟相关推荐

  1. Qt界面开发(各种控件以及图表)

    Qt界面开发(各种控件以及图表) 1.Qt简洁窗体 源代码链接:点击打开链接 2.QT漂亮界面 源代码链接:点击打开链接 3.音乐播放器界面 源代码链接:点击打开链接 4.六宫格界面 源代码链接:点击 ...

  2. C/C++教程 第二十一章 —— Qt界面开发

    文章目录 前言 一.创建项目 二.文件与代码详解 三.初步学习使用UI 四.Qt帮助文档的使用 五.在VS中使用Qt 六.常见错误解决方案 1.VS不识别控件名 2.编译报错或一大堆警告 3.突然无法 ...

  3. QT界面开发--基础学习篇一(上)

    一.Qt简单介绍: 1.QT的简单理解: Qt简单的说就是一种可以跨平台的编程语言工具,可以直接类比C语言和C++. 且一般QT的代码逻辑也是以C语言和C++(也可以适用于像JS的语言),可以直观理解 ...

  4. Qt界面开发资料汇总

    Qt VS2017中配置QT5.12开发环境_feitsg的博客-CSDN博客_vs中配置qt Qt下载(多种下载通道+所有版本) -- 下载 在visual studio 2017中配置Qt - h ...

  5. Linux+QT界面开发(含数据库)小结

    今天十一国庆节,过了一个很有意义的国庆节,去了龙岗区图书馆,第一次知道了借的书可以在任意分馆归还!这个切实方便了广大读者.针对Linux应用,特意借阅一本:<linux环境下Qt4图形界面与My ...

  6. Qt界面开发案例:图表主题示例

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

  7. qaxobject识别html,QT界面开发-QAxObject 读写excel(COM组件)-常用功能封装代码

    1 #include "qtExcelApi.h" 2 3 4 qtExcelApi::qtExcelApi(void)5 {6 7 }8 9 qtExcelApi::~qtExc ...

  8. 三维重建Qt界面开发-[未完成]

    图像浏览模板: https://download.csdn.net/download/zhangxiaoyu_sy/10178787 https://download.csdn.net/downloa ...

  9. Qt界面源码 -- 各种控件以及图表

    原文链接:https://blog.csdn.net/zhangxiaoyu_sy/article/details/78925221#comments 资源已经放到 链接:https://pan.ba ...

最新文章

  1. 将动画装入MicroPython I2C OLED
  2. k-means优化 k-means距离的选择 k-medoids对比
  3. Linux core dump的详细介绍及使用
  4. Atitit 热烈庆祝读经器项目圆满完成
  5. 【渝粤题库】陕西师范大学200701 数字逻辑
  6. 如何写出一个较好的快速排序程序
  7. Visual Stdio下安装WTL的向导Widzard
  8. 【Python】matplotlib.pyplot 常用技巧
  9. 【小松教你手游开发】【游戏渲染】单色shader,纹理shader
  10. 七月算法机器学习 6 特征工程 小案例
  11. 汽车之家各种车型参数爬虫
  12. java 获取某一日期的0点0分0秒和23点59分59秒
  13. H3C设备通过oid获取光衰
  14. html5小白——html5基础(简单个人博客模板)
  15. 数字系统实验—第11-12周任务(认识数据存储芯片HM62256、IP核、LPM开发流程和平台、 IIC串行总线时序分析)
  16. persevere的用法_努力奋斗的英文短语 努力的英文意思是
  17. 高通骁龙855发布,5G大幕拉开,新一轮手机大战在即
  18. 使用 * 打印等腰三角形
  19. 物联网卡平台的套餐资费
  20. 关于OneThink后台附件上传无法保存文件id或无法上传问题

热门文章

  1. 【Matplotlib】数据可视化实例分析
  2. 管理者的双重人格:霹雳手段,显菩萨心肠
  3. js如何用touchstart+touchend实现长按事件
  4. linux内存管理-系统调用brk()
  5. 防雷接地+防雷工程需要遵守的原则
  6. ubuntu安装grafana_如何在Ubuntu 20.04 LTS Focal Fossa上安装Grafana
  7. js图片加载不出来时隐藏图片
  8. 数字信号处理(5)- 卡尔曼滤波器
  9. 【制作微课的软件】Focusky教程 | 设置倒计时功能
  10. android与iPhoneX区别,【苹果iPhoneX评测】Android又遭歧视 连刷朋友圈质量都比iOS低-中关村在线...