整体思路:
时钟本身使用paintEvent函数进行绘制,使用timerEvent进行定时刷新。
-
绘制时钟,通过paintEvent实现,包括:时钟背景,表盘,刻度线,数字以及时针,分针,秒针。
-
使用timerEvent定时刷新,设置刷新时间为1000毫秒(1秒)
源码:
- 绘制时钟表盘,我这里的指针用一条线代替,线的起点固定为表盘中心,终点为随时间变化的函数。随着函数的不断调用,秒针终点也不断变化。
void Dialog::paintEvent(QPaintEvent* event)
{
QPainter painter(this);
QPixmap map(":/new/prefix1/clock1.jpg"); //为时钟添加背景图片
QRect q(0,0,769,960);
QRect q2(0,0,width(),height());
painter.drawPixmap(q2,map,q);
//基础的表盘结构通过循环结构——利用三角函数标示刻度
painter.drawEllipse(100,100,320,320);
double x1,x2,y1,y2;
for(int j=0;j<60;j++)
{
x1=260+160*cos(2*PI/60*j);
y1=260+160*sin(2*PI/60*j);
x2=260+155*cos(2*PI/60*j);
y2=260+155*sin(2*PI/60*j);
painter.drawLine(x1,y1,x2,y2);
x1=260+160*cos(2*PI/12*j);
y1=260+160*sin(2*PI/12*j);
x2=260+150*cos(2*PI/12*j);
y2=260+150*sin(2*PI/12*j);
painter.drawLine(x1,y1,x2,y2);
}
//十二个数字,在这一过程中可以对半径以及中心微调使得数字更整齐
int R=143;
for(int i=1;i<13;i++)
{
painter.drawText(255+R*sin(2*PI/12*i),261-R*cos(2*PI/12*i),QString::number(i));
}
//将秒针的终点与timerEvent关联,让秒针随着时间的调用动起来
int i;
double x,y;
for( i=0;i<60;i++)
{
x=260+150*cos(2*PI/60*t);
y=260+150*sin(2*PI/60*t);
}
painter.drawLine(260,260,x,y);//秒针
painter.drawLine(260,260,290,150);//分针
painter.drawLine(260,260,271,171);//时针
}
- 函数timerEvent,随着时间的不断变化,重绘函数paintEvent
void Dialog::timerEvent(QTimerEvent* event)
{
t++;
repaint();
}
整体代码
- (dialog.cpp)
#include "dialog.h"
#include "ui_dialog.h"
#include<QPainter>
#include<QTimer>
#include<QPixmap>
#define PI 3.1415926
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Dialog)
{
ui->setupUi(this);
startTimer(1000);//括号中指调用一次所用多少毫秒;每隔相应的时间调用一次函数
}
Dialog::~Dialog()
{
delete ui;
}
int t;
void Dialog::paintEvent(QPaintEvent* event)
{
QPainter painter(this);
QPixmap map(":/new/prefix1/clock1.jpg"); //为时钟添加背景图片
QRect q(0,0,769,960);
QRect q2(0,0,width(),height());
painter.drawPixmap(q2,map,q);
//基础的表盘结构通过循环结构——利用三角函数标示刻度
painter.drawEllipse(100,100,320,320);
double x1,x2,y1,y2;
for(int j=0;j<60;j++)
{
x1=260+160*cos(2*PI/60*j);
y1=260+160*sin(2*PI/60*j);
x2=260+155*cos(2*PI/60*j);
y2=260+155*sin(2*PI/60*j);
painter.drawLine(x1,y1,x2,y2);
x1=260+160*cos(2*PI/12*j);
y1=260+160*sin(2*PI/12*j);
x2=260+150*cos(2*PI/12*j);
y2=260+150*sin(2*PI/12*j);
painter.drawLine(x1,y1,x2,y2);
}
//十二个数字,在这一过程中可以对半径以及中心微调使得数字更整齐
int R=143;
for(int i=1;i<13;i++)
{
painter.drawText(255+R*sin(2*PI/12*i),261-R*cos(2*PI/12*i),QString::number(i));
}
//将秒针的终点与timerEvent关联,让秒针随着时间的调用动起来
int i;
double x,y;
for( i=0;i<60;i++)
{
x=260+150*cos(2*PI/60*t);
y=260+150*sin(2*PI/60*t);
}
painter.drawLine(260,260,x,y);//秒针
painter.drawLine(260,260,290,150);//分针
painter.drawLine(260,260,271,171);//时针
}
void Dialog::timerEvent(QTimerEvent* event)
{
t++;
repaint();
}
- (Dialog.h)
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
void paintEvent(QPaintEvent* event);
void timerEvent(QTimerEvent* event);
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H