如何用Qt制作时钟呢?下面一起来看一下吧:
- 首先来看一下成品图
我在网上找的好看的照片作为背景,用画板画表盘和各个指针,看起来效果挺不错。
- 主要代码
2.1、设置画家函数
2.2、背景部分
//添加背景图
QPixmap map(":/2.jpg");
//图片大小
QRect q(0,0,710,710);
//图片自定义拉伸
QRect q2(0,0,width(),height());
painter.drawPixmap(q2,map,q);
首先要会添加资源
一直继续就行
先添加前缀再添加文件
2.3、声明定时器
Clock::Clock(QWidget *parent) :
QWidget(parent),
ui(new Ui::Clock)
{
ui->setupUi(this);
//先声明一个定时器
QTimer*timer = new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(update()));
//连接电子时钟
connect(timer,SIGNAL(timeout()),this,SLOT(showTime()));
timer->start(1000);
//设置窗体名称和大小
setWindowTitle(tr("Clock"));
resize(400,400);
}
2.4、画布设置
//反走样功能,调用反锯齿功能,防止旋转时直线出现锯齿状
painter.setRenderHint(QPainter::Antialiasing);
//重新定义坐标的原点:把坐标放在窗体中间
painter.translate(width()/2,height()/2);
//调用drawText,增加文字“CLOCK”
painter.drawText(side/-5,side/-4,side/4,side/3,Qt::AlignRight,tr("CLOCK"));
//设定边界
painter.scale(side/250.0,side/250.0);
2.5、设置时钟部分
void Clock::paintEvent(QPaintEvent*)
{
//刻画时针、分针、秒针、长刻度、短刻度
static const QPoint hourHand[3]={
QPoint(7,14),
QPoint(-7,14),
QPoint(0,-50)
};
static const QPoint minuteHand[3]={
QPoint(5,14),
QPoint(-5,14),
QPoint(0,-65)
};
static const QPoint secondHand[3]={
QPoint(3,14),
QPoint(-3,14),
QPoint(0,-80)
};
static const QPoint line_long[2]={
QPoint(0,100),
QPoint(0,85)
};
static const QPoint line_short[2]={
QPoint(0,100),
QPoint(0,95)
};
//绘制的范围
int side=qMin(width(),height());
//获取当前时间
QTime time=QTime::currentTime();
//声明用来绘图的painter
QPainter painter(this);
绘画时钟
//使边线为黑色
painter.setPen(Qt::black);
//画刷的颜色
painter.setBrush(Qt::black);
//保存painter的状态
painter.save();
//设置painter的旋转角度
painter.rotate(30.0*((time.hour()+time.minute()/60.0)));
//设置时针
//画出多边形,3表示3条边
painter.drawConvexPolygon(hourHand,3);
//恢复当前画家状态
painter.restore();
painter.setPen(Qt::black);
//时针的12个刻度
for(int i=0;i<12;++i)
{ //画线
painter.drawLine(line_long[0],line_long[1]);
if(i==0)
{
painter.drawText(-20,-82,40,40,Qt::AlignHCenter|Qt::AlignTop,QString::number(12));
}
else
painter.drawText(-20,-82,40,40,Qt::AlignHCenter|Qt::AlignTop,QString::number(i));
painter.rotate(30.0);
}
painter.setPen(Qt::black);
painter.setBrush(Qt::black);
//保存状态
painter.save();
//绘制分针转角
painter.rotate(6.0*(time.minute()+time.second()/60.0));
painter.drawConvexPolygon(minuteHand,3);
painter.restore();
painter.setPen(Qt::black);
//分针刻度
for(int j=0;j<60;++j)
{
if((j%5)!=0)
painter.drawLine(line_short[0],line_short[1]);
painter.rotate(6.0);
}
painter.setPen(Qt::black);
painter.setBrush(Qt::black);
painter.save();
//绘制秒针转角
painter.rotate(6.0*time.second());
painter.drawConvexPolygon(secondHand,3);
painter.restore();
2.6、电子时钟
在项目头文件中,添加公共槽函数
在cpp文件里面,在构造函数中加入定时器的定义,关联信号槽,启动定时器
//先声明一个定时器
QTimer*timer = new QTimer(this);
//连接电子时钟
connect(timer,SIGNAL(timeout()),this,SLOT(showTime()));
timer->start(1000);
编写槽函数,实现时间显示和定时刷新
void Clock::showTime()
{
QTime time = QTime::currentTime();
QString txtTime=time.toString("hh:mm:ss");
ui->lcdNumber->display(txtTime);
//ui->lcdNumber->move(side2/3,side2/2);
}
3.最后是总代码
clock.h
clock.cpp
#include "clock.h"
#include "ui_clock.h"
#include <QTime>
#include <QTimer>
#include <QPainter>
#include <QPixmap>
Clock::Clock(QWidget *parent) :
QWidget(parent),
ui(new Ui::Clock)
{
ui->setupUi(this);
//先声明一个定时器
QTimer*timer = new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(update()));
//连接电子时钟
connect(timer,SIGNAL(timeout()),this,SLOT(showTime()));
timer->start(1000);
//设置窗体名称和大小
setWindowTitle(tr("Clock"));
resize(400,400);
}
void Clock::setTime(QTime)
{
}
void Clock::showTime()
{
QTime time = QTime::currentTime();
QString txtTime=time.toString("hh:mm:ss");
ui->lcdNumber->display(txtTime);
//ui->lcdNumber->move(side2/3,side2/2);
}
Clock::~Clock()
{
delete ui;
}
void Clock::paintEvent(QPaintEvent*)
{
//刻画时针、分针、秒针、长刻度、短刻度
static const QPoint hourHand[3]={
QPoint(7,14),
QPoint(-7,14),
QPoint(0,-50)
};
static const QPoint minuteHand[3]={
QPoint(5,14),
QPoint(-5,14),
QPoint(0,-65)
};
static const QPoint secondHand[3]={
QPoint(3,14),
QPoint(-3,14),
QPoint(0,-80)
};
static const QPoint line_long[2]={
QPoint(0,100),
QPoint(0,85)
};
static const QPoint line_short[2]={
QPoint(0,100),
QPoint(0,95)
};
//绘制的范围
int side=qMin(width(),height());
//获取当前时间
QTime time=QTime::currentTime();
//声明用来绘图的painter
QPainter painter(this);
//添加背景图
QPixmap map(":/2.jpg");
//图片大小
QRect q(0,0,710,710);
//图片自定义拉伸
QRect q2(0,0,width(),height());
painter.drawPixmap(q2,map,q);
//设定电子时钟的位置
ui->lcdNumber->move(width()/2.8,height()/1.7);
//反走样功能,调用反锯齿功能,防止旋转时直线出现锯齿状
painter.setRenderHint(QPainter::Antialiasing);
//重新定义坐标的原点:把坐标放在窗体中间
painter.translate(width()/2,height()/2);
//调用drawText,增加文字“CLOCK”
painter.drawText(side/-5,side/-4,side/4,side/3,Qt::AlignRight,tr("CLOCK"));
//设定边界
painter.scale(side/250.0,side/250.0);
//使边线为黑色
painter.setPen(Qt::black);
//画刷的颜色
painter.setBrush(Qt::black);
//保存painter的状态
painter.save();
//设置painter的旋转角度
painter.rotate(30.0*((time.hour()+time.minute()/60.0)));
//设置时针
//画出多边形,3表示3条边
painter.drawConvexPolygon(hourHand,3);
//恢复当前画家状态
painter.restore();
painter.setPen(Qt::black);
//时针的12个刻度
for(int i=0;i<12;++i)
{ //画线
painter.drawLine(line_long[0],line_long[1]);
if(i==0)
{
painter.drawText(-20,-82,40,40,Qt::AlignHCenter|Qt::AlignTop,QString::number(12));
}
else
painter.drawText(-20,-82,40,40,Qt::AlignHCenter|Qt::AlignTop,QString::number(i));
painter.rotate(30.0);
}
painter.setPen(Qt::black);
painter.setBrush(Qt::black);
//保存状态
painter.save();
//绘制分针转角
painter.rotate(6.0*(time.minute()+time.second()/60.0));
painter.drawConvexPolygon(minuteHand,3);
painter.restore();
painter.setPen(Qt::black);
//分针刻度
for(int j=0;j<60;++j)
{
if((j%5)!=0)
painter.drawLine(line_short[0],line_short[1]);
painter.rotate(6.0);
}
painter.setPen(Qt::black);
painter.setBrush(Qt::black);
painter.save();
//绘制秒针转角
painter.rotate(6.0*time.second());
painter.drawConvexPolygon(secondHand,3);
painter.restore();
}
main.cpp