目录
一、项目展示
时钟与计时器
二、UI界面布局
1、时钟UI界面
2、计时器UI界面
三、核心代码
1、生成时钟表盘
需要用到Qt绘图自定义控件
先获取当前时间
timer = startTimer(1000);
QTime nowtime = QTime::currentTime();
h = nowtime.hour();
m = nowtime.minute();
s = nowtime.second();
再完成时间功能与绘图自定义控件
void Widget::timerEvent(QTimerEvent *event)
{
s++;
if (s == 60)
{
s = 0;
m++;
if (m == 60)
{
m = 0;
h++;
if (h == 24)
{
h = 0;
}
}
}
}
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this); //必须在绘图事件中定义才会被激活
painter.setRenderHint(QPainter::Antialiasing,true); //消除锯齿
QPen mypen(Qt::black,3); //构建一只画笔mypen
painter.setPen(mypen); //使用画笔
QPoint center(this->width()/2,this->height()/2); //定点到画布的中心位置
painter.translate(center); //利用translate函数将原点定位到中心位置
QPoint cen(0,0);
//painter.drawEllipse(cen,200,200); //绘制时钟的外围
//绘制小时的刻度线
for(int i=0;i<12;i++)
{
painter.rotate(30);
painter.drawLine(0,-180,0,-200);
}
//绘制分钟的刻度线
for(int i=0;i<60;i++)
{
painter.rotate(6);
painter.drawLine(0,-190,0,-200);
}
painter.end();
QPainter painters(this); //定义一个画家来控制秒针
painters.setRenderHint(QPainter::Antialiasing,true);
mypen.setWidth(1);
mypen.setColor(Qt::red);
painters.setPen(mypen);
painters.translate(center);
painters.rotate(s*6); //秒针每次转6°
painters.drawLine(0,0,0,-150); //画出秒针
painters.end();
QPainter painterm(this); //定义一个画家来控制分针
painterm.setRenderHint(QPainter::Antialiasing,true);
mypen.setWidth(4);
mypen.setColor(Qt::blue);
painterm.setPen(mypen);
painterm.translate(center);
painterm.rotate(m*6); //分针每次转6°(一小格)
painterm.drawLine(0,0,0,-150);
painterm.end();
QPainter painterh(this); //定义一个画家来控制时针
painterh.setRenderHint(QPainter::Antialiasing,true);
mypen.setWidth(7);
mypen.setColor(Qt::green);
painterh.setPen(mypen);
painterh.translate(center);
painterh.rotate(h*30+m*0.5); //时针每小时偏移30°并在原来的基础上每分钟偏移0.5°
painterh.drawLine(0,0,0,-100);
painterh.end();
update(); //刷新绘图事件
}
2、页面跳转
UI界面的跳转经过测试需要加一个阻塞式延时,使跳转界面更加稳定。
miaobiao *miaobiao1 = new miaobiao;
//页面跳转
miaobiao1->setGeometry(this->geometry());
miaobiao1->show();
//关闭时钟界面
QThread::msleep(50);
this->close();
void miaobiao::on_btn_clock_clicked()
{
Widget *shizhong = new Widget;
//页面跳转
shizhong->setGeometry(this->geometry());
shizhong->show();
//关闭秒表界面
QThread::msleep(50);
this->close();
}
3、实现计时器功能
信号 timeout 与槽函数绑定
connect(&timer2,SIGNAL(timeout()),this,SLOT(timeOut_Slot()));
开始定时
void miaobiao::on_btn_start_clicked()
{
timer2.start(3);
}
停止定时
void miaobiao::on_btn_close_clicked()
{
timer2.stop();
i = 0;
}
重置定时器
//重置计时器
void miaobiao::on_btn_restart_clicked()
{
timer2.stop();
time2.setHMS(0,0,0,0);
ui->time->setText("00:00:00:000");
ui->jilu->clear();
i = 0;
}
将定时时间显示
void miaobiao::timeOut_Slot()
{
time2 = time2.addMSecs(3);
ui->time->setText(time2.toString("hh:mm:ss.zzz"));
}
4、例程代码
时钟核心代码
#include "widget.h"
#include "ui_widget.h"
#include <QTime>
#include <QPainter>
#include "miaobiao.h"
#include <QThread>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
timer = startTimer(1000);
QTime nowtime = QTime::currentTime();
h = nowtime.hour();
m = nowtime.minute();
s = nowtime.second();
}
Widget::~Widget()
{
delete ui;
}
void Widget::timerEvent(QTimerEvent *event)
{
s++;
if (s == 60)
{
s = 0;
m++;
if (m == 60)
{
m = 0;
h++;
if (h == 24)
{
h = 0;
}
}
}
}
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this); //必须在绘图事件中定义才会被激活
painter.setRenderHint(QPainter::Antialiasing,true); //消除锯齿
QPen mypen(Qt::black,3); //构建一只画笔mypen
painter.setPen(mypen); //使用画笔
QPoint center(this->width()/2,this->height()/2); //定点到画布的中心位置
painter.translate(center); //利用translate函数将原点定位到中心位置
QPoint cen(0,0);
//painter.drawEllipse(cen,200,200); //绘制时钟的外围
//绘制小时的刻度线
for(int i=0;i<12;i++)
{
painter.rotate(30);
painter.drawLine(0,-180,0,-200);
}
//绘制分钟的刻度线
for(int i=0;i<60;i++)
{
painter.rotate(6);
painter.drawLine(0,-190,0,-200);
}
painter.end();
QPainter painters(this); //定义一个画家来控制秒针
painters.setRenderHint(QPainter::Antialiasing,true);
mypen.setWidth(1);
mypen.setColor(Qt::red);
painters.setPen(mypen);
painters.translate(center);
painters.rotate(s*6); //秒针每次转6°
painters.drawLine(0,0,0,-150); //画出秒针
painters.end();
QPainter painterm(this); //定义一个画家来控制分针
painterm.setRenderHint(QPainter::Antialiasing,true);
mypen.setWidth(4);
mypen.setColor(Qt::blue);
painterm.setPen(mypen);
painterm.translate(center);
painterm.rotate(m*6); //分针每次转6°(一小格)
painterm.drawLine(0,0,0,-150);
painterm.end();
QPainter painterh(this); //定义一个画家来控制时针
painterh.setRenderHint(QPainter::Antialiasing,true);
mypen.setWidth(7);
mypen.setColor(Qt::green);
painterh.setPen(mypen);
painterh.translate(center);
painterh.rotate(h*30+m*0.5); //时针每小时偏移30°并在原来的基础上每分钟偏移0.5°
painterh.drawLine(0,0,0,-100);
painterh.end();
update(); //刷新绘图事件
}
void Widget::on_btn_miao_clicked()
{
miaobiao *miaobiao1 = new miaobiao;
//页面跳转
miaobiao1->setGeometry(this->geometry());
miaobiao1->show();
//关闭时钟界面
QThread::msleep(50);
this->close();
}
定时器核心代码
#include "miaobiao.h"
#include "ui_miaobiao.h"
#include "widget.h"
#include <QThread>
static int i;
miaobiao::miaobiao(QWidget *parent) :
QWidget(parent),
ui(new Ui::miaobiao)
{
ui->setupUi(this);
//信号 timeout 与槽函数绑定
connect(&timer2,SIGNAL(timeout()),this,SLOT(timeOut_Slot()));
time2.setHMS(0,0,0,0);
ui->time->setText("00:00:00:000");
}
miaobiao::~miaobiao()
{
delete ui;
}
void miaobiao::on_btn_clock_clicked()
{
Widget *shizhong = new Widget;
//页面跳转
shizhong->setGeometry(this->geometry());
shizhong->show();
//关闭秒表界面
QThread::msleep(50);
this->close();
}
//开始定时
void miaobiao::on_btn_start_clicked()
{
timer2.start(3);
}
//显示计时时间
void miaobiao::timeOut_Slot()
{
time2 = time2.addMSecs(3);
ui->time->setText(time2.toString("hh:mm:ss.zzz"));
}
//关闭计时器
void miaobiao::on_btn_close_clicked()
{
timer2.stop();
i = 0;
}
//重置计时器
void miaobiao::on_btn_restart_clicked()
{
timer2.stop();
time2.setHMS(0,0,0,0);
ui->time->setText("00:00:00:000");
ui->jilu->clear();
i = 0;
}
void miaobiao::on_btn_dadian_clicked()
{
QString temp;
i=i+1;
temp.sprintf("第%d次: ",i);
ui->jilu->append(temp);
ui->jilu->append(time2.toString("hh:mm:ss.zzz"));
}