用基础图形做一个钟表

简述

利用Qpainter可以画出一些简单的图形,再将这些简单的图形组合,配合一些其他的函数和事件,就能实现一个基础的钟表。

效果图

代码实现

  1. 设置背景图片(此步骤可以省略,根据需要添加)
//设置背景图片QPixmap map(":/rec/1_13.png");QRect q(0,0,1892,990);QRect q2(0,0,width(),height());painter.drawPixmap(q2,map,q);
  1. 设置窗口名称和图标
    setWindowTitle("clock");//窗口名称setWindowIcon(QIcon((":/rec/zhong.png")));//窗口图标
  1. 设置定时器,时间间隔为1000毫秒,并且将定时器时间与update函数关联为信号和槽,定时器每隔1秒发送一个信号,update接到信号后自动调用paintEvent事件。
    QTimer *timer1 = new QTimer(this);connect(timer1, SIGNAL(timeout()), this, SLOT(update()));timer1->start(1000);

4.绘制时针分针秒针的形状

    // 时针、分针、秒针 - 多边形static const QPoint hourHand[3] = {QPoint(3, 8),QPoint(-3, 8),QPoint(0, -40)};static const QPoint minuteHand[3] = {QPoint(3, 8),QPoint(-3, 8),QPoint(0, -65)};static const QPoint secondHand[3] = {QPoint(3, 8),QPoint(-3, 8),QPoint(0, -80)};

5.设置颜色(此步骤可以省略,根据需要添加)

     QColor hourColor(130,57,53, 200);QColor minuteColor(0, 127, 127, 150);QColor secondColor(0, 160, 230, 150);

6.获取系统时间,平移坐标系

     QTime time = QTime::currentTime();//获取系统时间painter.setRenderHint(QPainter::Antialiasing);painter.translate(width() / 2, height() / 2);// 平移坐标系原点至中心点painter.scale(qMin(width(), height())/ 200.0, qMin(width(), height())/ 200.0); // 缩放painter.drawEllipse(-96,-96,192,192);//画制边框圆

7.绘制时针和时刻度线

     // 绘制时针painter.setPen(Qt::NoPen);painter.setBrush(hourColor);painter.save();painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));painter.drawConvexPolygon(hourHand, 3);painter.restore();painter.setPen(hourColor);// 绘制时刻度线for (int i = 0; i < 12; ++i){painter.drawLine(88, 0, 96, 0);painter.rotate(30.0);}QFont font = painter.font();font.setBold(true);painter.setFont(font);

8.绘制小时文本
预先设置的接口:

QRectF Widget::textRectF(double radius, int pointSize, double angle)
{QRectF rectF;rectF.setX(radius*cos(angle*M_PI/180.0) - pointSize*2);rectF.setY(radius*sin(angle*M_PI/180.0) - pointSize/2.0);rectF.setWidth(pointSize*4);rectF.setHeight(pointSize*1.2);return rectF;
}
 // 绘制小时文本int radius = 100;int pointSize = font.pointSize();int nHour = 0;for (int i = 0; i < 12; ++i){nHour = i + 3;if (nHour > 12)nHour -= 12;painter.drawText(textRectF(radius*0.8, pointSize, i * 30), Qt::AlignCenter, QString::number(nHour));}

9.绘制分针和分针刻度线

  // 绘制分针painter.setPen(Qt::NoPen);painter.setBrush(minuteColor);painter.save();painter.rotate(6.0 * (time.minute() + time.second() / 60.0));painter.drawConvexPolygon(minuteHand, 3);painter.restore();painter.setPen(minuteColor);// 绘制分钟刻度线 for (int j = 0; j < 60; ++j){if ((j % 5) != 0)painter.drawLine(92, 0, 96, 0);painter.rotate(6.0);}

10.绘制秒针

// 绘制秒针painter.setPen(Qt::NoPen);painter.setBrush(secondColor);painter.save();painter.rotate(6.0 * time.second());painter.drawConvexPolygon(secondHand, 3);painter.restore();

源代码

头文件

#ifndef CLOCK_H
#define CLOCK_H
#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();QRectF textRectF(double radius, int pointSize, double angle);void paintEvent(QPaintEvent *event);
private:Ui::Widget *ui;
};
#endif // WIDGET_H

cpp文件

#include "widget.h"
#include "ui_widget.h"
#include <QTimer>
#include <QTime>
#include <QPainter>
#include <QFont>
#include <QPixmap>
#include <QIcon>
#define M_PI 3.1415926535898
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);setWindowTitle("clock");setWindowIcon(QIcon((":/rec/zhong.png")));//窗口图标QTimer *timer1 = new QTimer(this);connect(timer1, SIGNAL(timeout()), this, SLOT(update()));timer1->start(1000);
}
Widget::~Widget()
{delete ui;
}
QRectF Widget::textRectF(double radius, int pointSize, double angle)
{QRectF rectF;rectF.setX(radius*cos(angle*M_PI/180.0) - pointSize*2);rectF.setY(radius*sin(angle*M_PI/180.0) - pointSize/2.0);rectF.setWidth(pointSize*4);rectF.setHeight(pointSize*1.2);return rectF;
}
void Widget::paintEvent(QPaintEvent *event)
{// 时针、分针、秒针 - 多边形static const QPoint hourHand[3] = {QPoint(3, 8),QPoint(-3, 8),QPoint(0, -40)};static const QPoint minuteHand[3] = {QPoint(3, 8),QPoint(-3, 8),QPoint(0, -65)};static const QPoint secondHand[3] = {QPoint(3, 8),QPoint(-3, 8),QPoint(0, -80)};QColor hourColor(130,57,53, 200);QColor minuteColor(0, 127, 127, 150);QColor secondColor(0, 160, 230, 150);QTime time = QTime::currentTime();//获取系统时间painter.setRenderHint(QPainter::Antialiasing);painter.translate(width() / 2, height() / 2);// 平移坐标系原点至中心点painter.scale(qMin(width(), height())/ 200.0, qMin(width(), height())/ 200.0); // 缩放painter.drawEllipse(-96,-96,192,192);//画制边框圆// 绘制时针painter.setPen(Qt::NoPen);painter.setBrush(hourColor);painter.save();painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));painter.drawConvexPolygon(hourHand, 3);painter.restore();painter.setPen(hourColor);// 绘制时刻度线for (int i = 0; i < 12; ++i){painter.drawLine(88, 0, 96, 0);painter.rotate(30.0);}QFont font = painter.font();font.setBold(true);painter.setFont(font);// 绘制小时文本int radius = 100;int pointSize = font.pointSize();int nHour = 0;for (int i = 0; i < 12; ++i){nHour = i + 3;if (nHour > 12)nHour -= 12;painter.drawText(textRectF(radius*0.8, pointSize, i * 30), Qt::AlignCenter, QString::number(nHour));}// 绘制分针painter.setPen(Qt::NoPen);painter.setBrush(minuteColor);painter.save();painter.rotate(6.0 * (time.minute() + time.second() / 60.0));painter.drawConvexPolygon(minuteHand, 3);painter.restore();painter.setPen(minuteColor);// 绘制分钟刻度线for (int j = 0; j < 60; ++j){if ((j % 5) != 0)painter.drawLine(92, 0, 96, 0);painter.rotate(6.0);}// 绘制秒针painter.setPen(Qt::NoPen);painter.setBrush(secondColor);painter.save();painter.rotate(6.0 * time.second());painter.drawConvexPolygon(secondHand, 3);painter.restore();
}

用基础图形做一个钟表相关推荐

  1. 零基础Unity做一个中秋诗词鉴赏网页,提前祝您中秋快乐!(DoTween动画 | WebGL视频 | 大文件上传GitHub)

    零基础Unity做一个中秋诗词鉴赏网页,提前祝您中秋快乐! 前言 一,环境搭建 1.1 安装Unity 1.2 添加WebGl模块 二,开发项目 2.1 导入插件 2.2 项目搭建 2.3 逻辑处理 ...

  2. 【云开发】10分钟零基础学会做一个快递查询微信小程序,快速掌握微信小程序开发技能(轮播图、API请求)

    大家好,我叫小秃僧 这次分享的是10分钟零基础学会做一个快递查询微信小程序,快速掌握开发微信小程序技能. 这篇文章偏基础,特别适合还没有开发过微信小程序的童鞋,一些概念和逻辑我会讲细一点,尽可能用图说 ...

  3. 如何用极致业务基础平台做一个通用企业ERP系列之三启用期间管理设计

    接着篇幅2,我们现在要该设计一个启用期间管理了,启用期间管理,主要为方便管理,比如一些历史的单据,不允许他反审核去修改,作假.也不允许操作者在录入以前历史的单据. 期间管理我们框架提供了一个期间表,这 ...

  4. 如何用极致业务基础平台做一个通用企业ERP系列之二一览表培训

    接着上一篇博客,我们进行往来单位一览表设计如下: 可以看到我们设计的时候,将客户和供应商用两个字段来解决,这样基本可以解决那些往来单位有可能即是供应商又是客户的情况.当然因为这里不是主要做客户关系管理 ...

  5. 运用tkinter做一个钟表(动态)

    # -*- coding: utf-8 -*- # @Time : 2020/1/29 16:56 # @Author : LiuZe # @File : 钟表.py # @Software : Py ...

  6. 如何用idea做一个简易的网页登录界面

    在上一节课的内容基础上做一个简易的网页登录界面--18级软工1班03 打开idea后打开上一节课的工程文件(一般在打开idea软件的同时,idea会默认打开上一次的文件)并在左边列表的main文件夹下 ...

  7. 用HTML做一个注册页面

    学完了HTML的基础知识,做一个小练习巩固一下 <!DOCTYPE html> <html> <head><meta charset="UTF-8& ...

  8. 做一个支持图形界面的操作系统(上)

    分类: OS2006-05-01 20:00 856人阅读 评论(0) 收藏 举报 原文:http://www.binghua.com/Article/Class6/Class7/200409/267 ...

  9. 做一个支持图形界面的操作系统(zz)

    原文:http://www.binghua.com/Article/Class6/Class7/200409/267.html (转载及引用请注明明原作者及出处) (pdf: http://www.b ...

最新文章

  1. 利用边缘检测计算物体面积(内含源码)
  2. oracle解密des乱码,Oracle中des等算法的加解密
  3. 不受微软待见的Python,如何在八年内逆袭成功?
  4. C#、.Net经典面试题目及答案
  5. python 倒排索引 性能_python 实现倒排索引的方法
  6. 潘在亮:给业务开发提供黑科技装备的“测试Q博士”
  7. php const用法详解
  8. sql优化-项目实战
  9. 苹果Mac分享几个爱用音乐播放器
  10. 【死磕 Spring】—– IOC 之 bean 的初始化
  11. 扫描全能王文件上传不了服务器,如何将扫描全能王的文档轻松保存到坚果云?...
  12. 华为mate xs拍照怎么用?镜像智拍助你告别大饼脸
  13. 京东返利PHP采集关键字,php 抓取京东产品数据-标题,价格,首图片
  14. 如何获得onblur中的值_js中onfocus、onblur事件
  15. 【R_绘图】绘图字体设为Times New Roman
  16. Windows10下使用Conda安装TensorFlow-GPU
  17. 虚拟偶像PK现实偶像,哪个更能发挥粉丝经济效应?
  18. 输入你的密码来连接到_手机无线网络可以连接但上不了网如何解决【详解】
  19. 入侵特斯拉汽车Model S 信息娱乐系统漏洞
  20. TusharePro快速入门

热门文章

  1. Fortify 代码扫描安装使用教程
  2. Single-Stage Multi-Person Pose Machines
  3. [Docker] Docker设置镜像代理
  4. 【Android】android开发---实现屏幕旋转的两种方法
  5. Macmini 所有机型的【待机、工作】 功率
  6. 【广告算法工程师入门 9】机制设计-博弈论基础
  7. to B和to C是什么意思?它们有什么区别?
  8. idea 导出war包,IDEA导出Web项目war包并放入Tomcat运行起来
  9. 苏州线下python培训班
  10. 618特辑 | 人到中年的品质生活,是我对自己的最大尊重