概述
简述
利用QTimer,QPainter等实现动态时钟以及与本机时间匹配。
实现方式
1.QTimer实现定时器,设置时间为1000毫秒;
2.Qpainter 制作表盘,时针,分针,秒针等。
效果图
可能背景图不太好看…
代码实现
1.创建项目
2.构造一个定时器 QTimer,连接其超时信号 timeout() 到槽函数 update(),当调用 update() 时,系统会自动通知当前界面进行重绘(paintEvent())。
QTimer *timer=new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(update()));
timer->start(1000);
3.设置原点到中心,以及图形缩放
painter.setRenderHint(QPainter::Antialiasing);
// 平移坐标系原点至中心点
painter.translate(width()/2,height()/2);
// 缩放
painter.scale(side / 210.0, side / 210.0);
4.绘制时针,分针,秒针的颜色,位置等(代码过长,在下面源代码中显示)
完整代码
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QPaintEvent>
#include <QPainter>
#include <QTime>
#include <QTimer>
#include <QPen>
#include <QFont>
#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);
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Dialog)
{
ui->setupUi(this);
QTimer *timer=new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(update()));
timer->start(1000);
setWindowTitle(tr("My Clock"));
resize(1000,800);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
QPixmap map(":/new/prefix1/C:/Users/Lenovo/Desktop/picture/beijing.jpg");
QRect q(0,0,width(),height());
QRect q1(0,0,1920,1080);
QRect q2(0,0,750,750);
painter.drawPixmap(q,map,q1);
QPixmap pixmap(":/new/prefix1/C:/Users/Lenovo/Desktop/picture/picture1.jpg");
painter.drawPixmap(q,pixmap,q2);
// 时针、分针、秒针位置 - 多边形
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, -70)
};
static const QPoint secondHand[3] = {
QPoint(3,8),
QPoint(-3, 8),
QPoint(0, -90)
};
int side = qMin(width(), height());
QTime time = QTime::currentTime();
painter.setRenderHint(QPainter::Antialiasing);
// 平移坐标系原点至中心点
painter.translate(width()/2,height()/2);
// 缩放
painter.scale(side / 210.0, side / 210.0);
// 绘制时针
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::black);
painter.save();
// 每圈360° = 12h 即:旋转角度 = 小时数 * 30°
painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));
painter.drawConvexPolygon(hourHand, 3);
painter.restore();
painter.setPen(Qt::black);
// 绘制小时线 (360度 / 12 = 30度)
for (int i = 0; i < 12; ++i) {
painter.drawLine(88, 0, 96, 0);
if (i == 0)
painter.drawText(-10,-88,20,20,Qt::AlignHCenter | Qt::AlignTop,QString::number(12));
else
painter.drawText(-10,-88,20,20,Qt::AlignHCenter | Qt::AlignTop,QString::number(i));
painter.rotate(30.0);
}
// 绘制分针
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::blue);
painter.save();
// 每圈360° = 60m 即:旋转角度 = 分钟数 * 6°
painter.rotate(6.0 * (time.minute() + time.second() / 60.0));
painter.drawConvexPolygon(minuteHand, 3);
painter.restore();
painter.setPen(Qt::black);
// 绘制分钟线 (360度 / 60 = 6度)
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(Qt::red);
painter.save();
// 每圈360° = 60s 即:旋转角度 = 秒数 * 6°
painter.rotate(6.0 * time.second());
painter.drawConvexPolygon(secondHand, 3);
painter.restore();
}
main.cpp
#include "dialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show();
return a.exec();
}
参考:https://blog.csdn.net/liang19890820/article/details/52064169
注意:可以自行找一些好看的时钟表盘,同时也注意要修改参数。
最后
以上就是英勇手链为你收集整理的【Qt】定时器应用2之动态时钟的全部内容,希望文章能够帮你解决【Qt】定时器应用2之动态时钟所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复