我是靠谱客的博主 缓慢高山,最近开发中收集的这篇文章主要介绍使用Qt绘图制作一个钟表,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

使用Qt绘图制作一个钟表

实际效果如下:

钟表

一、钟表实现的大概思路
设置定时器,定时器每隔一秒调用repaint()函数,paintEvent()函数随即被调用,利用paintEvent()函数重绘钟表,以秒为单位显示时钟表盘指针的变化。根据获取的当前系统时间的时钟,分钟以及秒钟的数据来绘制钟表的时针,分针以及秒针。paintEvent()函数里有涉及重绘需要调用的函数有四个,分别是重绘表盘函数,重绘时针函数,重绘分针函数以及重绘秒针函数。
二、重绘函数
因为有图形绕点旋转的情况,这里需要使用translate(x,y)函数转换坐标原点,方便成像。绘制钟表指针需要旋转坐标系,然后在旋转过的坐标系中绘制指针。指针绘制完毕后,恢复坐标系。 根据获取系统的时间,算出绘制指针前坐标需要旋转的角度。
时针:30.0*(time.hour()+time.minute()/60.0)
分针:6.0*(time.minute()+time.second()/60.0)
秒针:6.0*(time.second())
1、重绘表盘函数
表盘的刻度有时钟刻度和分钟刻度。一圈有六十个间隔,所以每个间隔6°,每隔6°为一个分钟时刻,每隔30°为一个时钟时刻。

void Dialog::ClockDial(QPainter *painter){
    for(int i=1;i<=60;i++){
        painter->save();
        painter->rotate(6.0*i);
        if(i%5==0){
            painter->drawLine(0,-88,0,-95);
            painter->drawText(-20, -82, 40, 40,
                              Qt::AlignHCenter | Qt::AlignTop,
                              QString::number(i/5));
        }
        else{
            painter->drawLine(0,-92,0,-95);
        }
        painter->restore();
    }
}

2、重绘时针函数
确定组成时针四个点的坐标,使用drawPolygon()函数或者drawConvexPolygon()函数绘制。

const QPoint Dialog::hourhand[4] = {
    QPoint(3, 5),
    QPoint(0, 13),
    QPoint(-3, 5),
    QPoint(0, -40)
};

void Dialog::Hourhand(QPainter *painter){
    QTime time=QTime::currentTime();
    painter->save();
    painter->rotate(30.0*(time.hour()+time.minute()/60.0));
    painter->drawPolygon(hourhand,4);
    painter->restore();
}

3、重绘分针函数
确定组成分针四个点的坐标,使用drawPolygon()函数或者drawConvexPolygon()函数绘制。

const QPoint Dialog::minutehand[4] = {
    QPoint(3, 5),
    QPoint(0, 16),
    QPoint(-3, 5),
    QPoint(0, -70)
};
void Dialog::Minutehand(QPainter *painter){
    QTime time=QTime::currentTime();
    painter->save();
    painter->rotate(6.0*(time.minute()+time.second()/60.0));
    painter->drawPolygon(minutehand,4);
    painter->restore();
}

4、重绘秒针函数
确定组成秒针四个点的坐标,使用drawPolygon()函数或者drawConvexPolygon()函数绘制。

const QPoint Dialog::secondhand[4]={
    QPoint(3, 5),
    QPoint(0, 13),
    QPoint(-3, 5),
    QPoint(0, -85)
};

void Dialog::Secondhand(QPainter *painter){
    QTime time=QTime::currentTime();
    painter->save();
    painter->rotate(6.0*(time.second()));
    painter->drawPolygon(secondhand,4);
    painter->restore();
}

三、paintEvent()函数
依次调用重绘函数。setViewport()函数设定窗口中心,使钟表显示在画面中心。

void Dialog::paintEvent(QPaintEvent *event){
    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);
    ClockDial(&painter);
    Secondhand(&painter);
    Minutehand(&painter);
    Hourhand(&painter);
}

四、代码实现
dialog.h

#ifndef DIALOG_H
#define DIALOG_H


#include <QDialog>


#include<QPainter>
#include<QTime>
#include<QTimerEvent>




class Dialog : public QDialog
{
    Q_OBJECT


public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();
private:
    const static QPoint secondhand[4];
    const static QPoint minutehand[4];
    const static QPoint hourhand[4];
protected:
    void Secondhand(QPainter*painter);
    void Minutehand(QPainter*painter);
    void Hourhand(QPainter*painter);
    void ClockDial(QPainter*painter);
    void paintEvent(QPaintEvent*event);
    void timerEvent(QTimerEvent*event);


};
#endif // DIALOG_H

dialog.cpp

#include "dialog.h"


const QPoint Dialog::secondhand[4]={
    QPoint(3, 5),
    QPoint(0, 13),
    QPoint(-3, 5),
    QPoint(0, -85)
};


const QPoint Dialog::minutehand[4] = {
    QPoint(3, 5),
    QPoint(0, 16),
    QPoint(-3, 5),
    QPoint(0, -70)
};


const QPoint Dialog::hourhand[4] = {
    QPoint(3, 5),
    QPoint(0, 13),
    QPoint(-3, 5),
    QPoint(0, -40)
};


Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    startTimer(1000);
}


Dialog::~Dialog()
{
    setWindowTitle("Clock");
    resize(360,360);
}




void Dialog::timerEvent(QTimerEvent *event){
    repaint();
}


void Dialog::paintEvent(QPaintEvent *event){
    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);
    ClockDial(&painter);
    Secondhand(&painter);
    Minutehand(&painter);
    Hourhand(&painter);
}


void Dialog::Secondhand(QPainter *painter){




    QTime time=QTime::currentTime();
    painter->save();
    painter->rotate(6.0*(time.second()));
    painter->drawPolygon(secondhand,4);
    painter->restore();
}




void Dialog::Minutehand(QPainter *painter){




    QTime time=QTime::currentTime();
    painter->save();
    painter->rotate(6.0*(time.minute()+time.second()/60.0));
    painter->drawPolygon(minutehand,4);
    painter->restore();
}


void Dialog::Hourhand(QPainter *painter){




    QTime time=QTime::currentTime();
    painter->save();
    painter->rotate(30.0*(time.hour()+time.minute()/60.0));
    painter->drawPolygon(hourhand,4);
    painter->restore();
}




void Dialog::ClockDial(QPainter *painter){
    for(int i=1;i<=60;i++){
        painter->save();
        painter->rotate(6.0*i);
        if(i%5==0){




            painter->drawLine(0,-88,0,-95);
            painter->drawText(-20, -82, 40, 40,
                              Qt::AlignHCenter | Qt::AlignTop,
                              QString::number(i/5));


        }
        else{
            painter->drawLine(0,-92,0,-95);


        }
        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();
}

最后

以上就是缓慢高山为你收集整理的使用Qt绘图制作一个钟表的全部内容,希望文章能够帮你解决使用Qt绘图制作一个钟表所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部