QT实现简单时钟效果

 更新时间:2020年05月30日 08:44:02   作者:师子文  
这篇文章主要为大家详细介绍了QT实现简单时钟效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了QT实现简单时钟效果的具体代码,供大家参考,具体内容如下

先上效果图:

预备知识:

一.钟表实现原理

设置定时器timer,每隔1000毫秒(即1s)发送timeout()信号到槽函数update(),重绘事件函数paintEvent(QPaintEventevent)

二.钟表的绘制方法

拆分钟表:表盘 数字 刻度线 指针

paintEvent(QPaintEventevent)

1.设置定时器,时间间隔为1000毫秒,并且将定时器时间与update函数关联为信号和槽,定时器每隔1秒发送一个信号
2.绘制时针分针秒针的形状。

// 时针、分针、秒针 - 多边形
 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)
 };

3.绘制时针和时刻度线

 // 绘制时针
 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);

下面是一些基础的绘图函数:

drawPoint() 绘制点
drawLine() 绘制线
drawRect() 绘制矩形
drawEllipse() 绘制椭圆(绘制圆也是此函数)
drawConvexPolygon() 绘制凸多边形
drawText() 编制文本

特别的,我们还会经常用到
QPen:绘制几何图形的边缘,可绘制颜色,宽度,线的风格等
QBrush:用于几何图形的调色板与填充
则可借用setPen()来当做画笔来使用。
setBrush()来当做填充器使用来填充颜色。
setPen(color);
然后我们的绘制将会用此颜色的画笔来绘制图形边缘。
setBrush(color);

主要代码展示:

void Widget::drawhourhand(QPainter*painter)
{
 QTime time=QTime::currentTime();
 painter->setBrush(Qt::blue);//画刷,填充
 painter->setPen(Qt::Dense7Pattern);//画笔,制作廓线
 painter->save();
 painter->rotate(30.0*(time.hour()+time.minute()/60));//使得指针旋转到当前时间位置
 painter->drawConvexPolygon(hourhand,4);;//绘制时针(凸多边形)
 painter->restore();//与save连着用 绘制图形后复位坐标系
}
void Widget::drawminutehand(QPainter*painter)
{
 QTime time=QTime::currentTime();
 painter->setBrush(Qt::white);
 painter->setPen(Qt::Dense5Pattern);
 painter->save();
 painter->rotate(6.0*(time.minute()+time.second()/60.0));
 painter->drawConvexPolygon(minutehand,4);
 painter->restore();
}
void Widget::drawsecondhand(QPainter*painter)
{
 QTime time=QTime::currentTime();
 painter->setBrush(Qt::red);
 painter->setPen(Qt::Dense5Pattern);
 painter->save();
 painter->rotate(6*time.second());
 painter->drawPolygon(minutehand,4);
 painter->restore();
}
``


```cpp
#include "widget.h"
#include "ui_widget.h"


Widget::Widget(QWidget *parent) :
 QWidget(parent),
 ui(new Ui::Widget)
{
 ui->setupUi(this);
 font.setPixelSize(10);
 setFont(font);
 setWindowTitle("THE CLOCK");
 resize(1200,820);
}


Widget::~Widget()
{
 delete ui;
}
const QPoint Widget::hourhand[4]={
 QPoint(5,5),QPoint(0,13),QPoint(-5,5),QPoint(0,-40)
};
const QPoint Widget::minutehand[4]={
 QPoint(3,5),QPoint(0,16),QPoint(-3,5),QPoint(0,-70)
};
const QPoint Widget::secondhand[4]={
 QPoint(0,0),QPoint(0,0),QPoint(0,0),QPoint(0,0)
};
void Widget::drawhourhand(QPainter*painter)
{
 QTime time=QTime::currentTime();
 painter->setBrush(Qt::blue);//画刷,填充
 painter->setPen(Qt::Dense7Pattern);//画笔,制作廓线
 painter->save();
 painter->rotate(30.0*(time.hour()+time.minute()/60));//使得指针旋转到当前时间位置
 painter->drawConvexPolygon(hourhand,4);;//绘制时针(凸多边形)
 painter->restore();//与save连着用 绘制图形后复位坐标系
}
void Widget::drawminutehand(QPainter*painter)
{
 QTime time=QTime::currentTime();
 painter->setBrush(Qt::white);
 painter->setPen(Qt::Dense5Pattern);
 painter->save();
 painter->rotate(6.0*(time.minute()+time.second()/60.0));
 painter->drawConvexPolygon(minutehand,4);
 painter->restore();
}
void Widget::drawsecondhand(QPainter*painter)
{
 QTime time=QTime::currentTime();
 painter->setBrush(Qt::red);
 painter->setPen(Qt::Dense5Pattern);
 painter->save();
 painter->rotate(6.0*time.second());
 painter->drawPolygon(minutehand,4);
 painter->restore();
}
void Widget::paintEvent(QPaintEvent*event)
{
 QPainter painter(this);
 QTimer*timer=new QTimer(this);
 timer->start(1000);
 connect(timer,SIGNAL(timeout()),this,SLOT(update()));
 QPixmap map(":/new/prefix1/timg (1).jfif");
 QRect q(0,0,1200,800);//截取这么大的面积
 QRect q2(0,0,width(),height());//放到指定大小的框中
 painter.drawPixmap(q2,map,q);
 painter.setRenderHint(QPainter::Antialiasing,true);//反走样
 int side=qMin(width(),height());
 painter.setWindow(0,0,230,230);//原本截取放大的面积区域多大
 painter.setViewport(96,0,side,side);//映射到新的区域面积多大
 painter.translate(100,100);//重新设定坐标原点
 drawhourhand(&painter);
 drawminutehand(&painter);
 drawsecondhand(&painter);
 drawclockdial(&painter);
 QString timeStr= QTime::currentTime().toString(); //绘制当前的电子时间
 painter.setPen(Qt::white);
 painter.drawText(-20,30,80,30,0,timeStr);
 painter.setBrush(Qt::black);
 painter.drawEllipse(QPoint(0,0),3,3);//中间画个小圆点
 // QTransform Transform;
 // Transform.rotate(90);
 // painter.setTransform(Transform);
 painter.drawText(-53,-30,QStringLiteral("老子利指导,杀人先看表"));
}
void Widget::drawclockdial(QPainter*painter)
{
 hourhandpen.setColor(Qt::white);
 hourhandpen.setWidth(2.0);//设置小时刻度线为粗黑
 minutehandpen.setColor(Qt::white);
 for(int i=1;i<=60;i++)
 {
 painter->save();
 painter->rotate(6*i);
 if(i%5==0)
 {
  painter->setPen(hourhandpen);
  painter->drawLine(0,-98,0,-82);//原点变了
  painter->drawText(-20,-82,40,40,Qt::AlignHCenter|Qt::AlignTop,QString::number(i/5));
 }
 else
 {
  painter->setPen(minutehandpen);
  painter->drawLine(0,-98,0,-88);
 }
 painter->restore();
 }


}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C++封装IATHOOK类实例

    C++封装IATHOOK类实例

    这篇文章主要介绍了C++封装IATHOOK类的实现方法,对IAT的HOOK实例进行了封装,非常具有实用价值,需要的朋友可以参考下
    2014-10-10
  • C语言详解用char实现大小写字母的转换

    C语言详解用char实现大小写字母的转换

    这篇文章主要给大家介绍了关于C语言实现大小写字母转换的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • C++11中delete和default的用法详解

    C++11中delete和default的用法详解

    这篇文章主要为大家详细介绍了C++11中delete和default的具体用法,文中的示例代码简洁易懂,具有一定的学习价值,感兴趣的小伙伴可以了解下
    2023-08-08
  • 详解C++ 引用

    详解C++ 引用

    这篇文章主要介绍了C++ 引用的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • C++深入讲解初始化列表的用法

    C++深入讲解初始化列表的用法

    这篇文章主要介绍了C++成员初始化列表,除了可以使用构造函数对类成员进行初始化之外,C++还提供了另外一种初始化的方法,叫做成员初始化列表。下面来看看文章的详细吧,需要的朋友可以参考一下
    2022-04-04
  • C++实现ETW进行进程变动监控详解

    C++实现ETW进行进程变动监控详解

    ETW提供了一种对用户层应用程序和内核层驱动创建的事件对象的跟踪记录机制。为开发者提供了一套快速、可靠、通用的一系列事件跟踪特性。本文将利用ETW进行进程变动监控,需要的可以参考一下
    2022-07-07
  • C语言编写汉诺塔游戏

    C语言编写汉诺塔游戏

    这篇文章主要介绍了C语言编写汉诺塔游戏,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-11-11
  • C++多文件变量解析

    C++多文件变量解析

    大家注意不要在头文件中定义变量,在头文件中声明变量。定义放在对应的源文件中。其他地方只能用extern声明
    2013-10-10
  • C++ 头文件系列(set)详解

    C++ 头文件系列(set)详解

    一般而言,每个C++/C程序通常由头文件和定义文件组成。头文件作为一种包含功能函数、数据接口声明的载体文件,主要用于保存程序的声明,而定义文件用于保存程序的实现 。
    2017-02-02
  • 浅谈C++基类的析构函数为虚函数

    浅谈C++基类的析构函数为虚函数

    本文重点:应该为多态基类声明虚析构器。一旦一个类包含虚函数,它就应该包含一个虚析构器。如果一个类不用作基类或者不需具有多态性,便不应该为它声明虚析构器。
    2015-10-10

最新评论