Qt制作一个运动的钟表

一.钟表的绘制
钟表的绘制包括时针、分针、秒针、刻度盘
1.时针绘制
void Widget::drawHourHand(QPainter painter)
{
QTime time = QTime::currentTime();
QColor HourHandColor(205,193,197,200);
painter->setPen(Qt::NoPen);
painter->setBrush(HourHandColor);
painter->save();
painter->rotate(30.0
(time.hour()+time.minute()/60.0));
painter->drawConvexPolygon(hourHand,4);//绘制时针
painter->restore();//绘制图形后复位坐标系
2.分针绘制

void Widget::drawMinuteHand(QPainter painter)
{
QTime time = QTime::currentTime();
QColor HourHandColor(205,175,149,200);
painter->setPen(Qt::NoPen);
painter->setBrush(HourHandColor);
painter->save();
painter->rotate(6.0
(time.minute()+time.second()/60.0));
painter->drawConvexPolygon(minuteHand,4);//绘制分针
painter->restore();//绘制图形后复位坐标系
}
3.秒针绘制
void Widget::drawsecondHand(QPainter painter)
{
QTime time = QTime::currentTime();
QColor HourHandColor(193,205,205,200);
painter->setBrush(HourHandColor);
painter->setPen(Qt::NoPen);
painter->save();//保存坐标系,防止坐标系跑偏了
painter->rotate(6.0
time.second());//注意是6.0,不是6
painter->drawConvexPolygon(secondHand,4);//绘制秒针
painter->restore();//绘制图形后复位坐标系
4.钟表刻度盘绘制
坐标轴系统每6°为一个分钟刻度,每30°为一个时钟刻度。

void Widget::drawClockDial(QPainter painter)
{
//绘制钟表刻度盘和数字
for (int i = 1; i <=60; ++i)
{
painter->save();
painter->rotate(6
i);//坐标轴旋转6度
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();//绘制图形后复位坐标系
}
}

QColor HourHandColor(193,205,205,200);
可以改变四个参数来改变指针颜色,四个参数的含义分别是(red,green,blue,透明度)具体可参见https://www.sojson.com/rgb.html三原色表

二.代码实现
dialog.h文件
#ifndef DIALOG_H
#define DIALOG_H

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

class Widget : public QWidget
{
Q_OBJECT

public:
Widget(QWidget *parent = nullptr);
~Widget();
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);

private:
QPixmap pix;
QPoint dragPosition;
static const QPoint hourHand[4];
static const QPoint minuteHand[4];
static const QPoint secondHand[4];
QPen hourHandPen;
QPen minuteHandPen;
QFont font;

protected:
void paintEvent(QPaintEvent *);
void drawHourHand(QPainter *painter);
void drawMinuteHand(QPainter *painter);
void drawsecondHand(QPainter *painter);
void drawClockDial(QPainter *painter);
};

#endif // DIALOG_H

dialog.cpp文件
#include “dialog.h”
#include “ui_dialog.h”
#include “dialog.h”
#include
#include

Widget::Widget(QWidget *parent)
QWidget(parent)
{
//hourHandPen = QPen(palette().foreground(), 2.0);//设置小时刻度线为粗黑
//minuteHandPen = QPen(palette().foreground(), 1.0);//设置分钟刻度线为灰
font.setPointSize(10);//字体大小设置为10
setFont(font);
QTimer *timer = new QTimer(this);
timer->start(1000);//一秒钟
connect(timer,SIGNAL(timeout()),this,SLOT(update()));
setWindowTitle("The Clock");
resize(360, 360);

}

Widget::~Widget()
{

}
const QPoint Widget::hourHand[4] = {
QPoint(3, 5),
QPoint(0, 13),
QPoint(-3, 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(3, 5),
QPoint(0, 18),
QPoint(-3, 5),
QPoint(0, -90)
};

void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
int side = qMin(width(), height());
painter.setViewport((width() - side) / 2, (height() - side) / 2,
side, side);
painter.setWindow(0, 0, 200, 200);
painter.translate(100,100);//重新设定坐标原点
drawClockDial(&painter);
drawHourHand(&painter);
drawMinuteHand(&painter);
drawsecondHand(&painter);
painter.setBrush(Qt::black);
painter.drawEllipse(QPoint(0,0),3,3);
}
//画出时针
void Widget::drawHourHand(QPainter painter)
{
QTime time = QTime::currentTime();
QColor HourHandColor(205,193,197,200);
painter->setPen(Qt::NoPen);
painter->setBrush(HourHandColor);
painter->save();
painter->rotate(30.0
(time.hour()+time.minute()/60.0));
painter->drawConvexPolygon(hourHand,4);//绘制时针
painter->restore();//绘制图形后复位坐标系
}
//画出分针
void Widget::drawMinuteHand(QPainter painter)
{
QTime time = QTime::currentTime();
QColor HourHandColor(205,175,149,200);
painter->setPen(Qt::NoPen);
painter->setBrush(HourHandColor);
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();
QColor HourHandColor(193,205,205,200);
painter->setBrush(HourHandColor);
painter->setPen(Qt::NoPen);
painter->save();//保存坐标系,防止坐标系跑偏了
painter->rotate(6.0
time.second());//注意是6.0,不是6
painter->drawConvexPolygon(secondHand,4);//绘制秒针
painter->restore();//绘制图形后复位坐标系
}
//刻写刻度盘
void Widget::drawClockDial(QPainter painter)
{
//绘制钟表刻度盘和数字
for (int i = 1; i <=60; ++i)
{
painter->save();
painter->rotate(6
i);//坐标轴旋转6度
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();//绘制图形后复位坐标系
}
}

//鼠标按键响应事件
void Widget::mousePressEvent(QMouseEvent *event){
if(event->button()==Qt::LeftButton){
//计算当前窗体的位置
dragPosition=event->globalPos()-frameGeometry().topLeft();
event->accept();
}
if(event->button()==Qt::RightButton){
close();
}
}

//鼠标移动响应事件
void Widget::mouseMoveEvent(QMouseEvent *event){
if(event->buttons()&Qt::LeftButton){
move(event->globalPos()-dragPosition);
event->accept();
}
}
main.cpp文件

#include “dialog.h”

#include

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

Widget w;
w.show();
return a.exec();

}

三.运行截图
时钟效果图

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值