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

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用vs制作音乐播放器和使用Qt制作音乐播放器在很多方面有一些相似之处,但也有一些显著的差异。 首先,无论是使用vs还是Qt,都可以实现创建一个图形界面的音乐播放器。通过使用图形界面,用户可以更直观地浏览和操作音乐文件。无论是选择vs还是Qt,都可以通过拖放控件、设置按钮和进度条等来构建用户友好的界面。 然而,vs和Qt的工作方式有所不同。在使用vs时,开发者通常会使用C#或C++等语言来编写代码。vs提供了一系列的图形界面设计工具,如Windows Forms或WPF,可以方便地创建图形界面。通过使用.NET Framework等库,可以轻松处理音乐文件的读取和播放。 相比之下,Qt一个跨平台的开发框架,使用C++语言编写代码。Qt在图形界面开发方面拥有强大的功能和灵活性。通过使用Qt的库和类,可以轻松实现音乐文件的读取、解码和播放功能。Qt还提供了丰富的UI控件和可定制化的样式,以满足开发者对音乐播放器界面的自定义需求。 另一个重要的区别是vs和Qt的适用平台不同。使用vs创建的音乐播放器主要运行在Windows操作系统上,而使用Qt创建的音乐播放器可以在多个操作系统上运行,包括Windows、Linux和Mac OS等。这意味着,如果开发者希望将音乐播放器应用到不同的平台上,选择Qt可能更具有优势。 总而言之,在选择vs还是Qt制作音乐播放器时,需要考虑开发者的编程经验、目标平台和需求,然后选择最适合的工具和技术来实现功能丰富的音乐播放器。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值