用坐标转换coordinate transformation算法与时钟做一个clock

通过时钟Timer,运用坐标转换算法,可以方便做一个简单的钟表。

坐标系

https://blog.csdn.net/fanyun_01/article/details/53129781

添加要用的头文件

#include <QTime>
#include <QTimer>
#include <QPainter>

重写paintEvent绘画虚函数

virtual void paintEvent(QPaintEvent* event);

添加一个slot,用于时钟更新

public slots:
    void updateWindow();

在paintEvent添加代码

void ClockDialog::paintEvent(QPaintEvent *event)
{
    static const QPoint hourHand[4]{
        QPoint(4, 4),
        QPoint(-4, 4),
        QPoint(-4, -40),
        QPoint(4, -40)
    };
    static const QPoint minuteHand[3]{
        QPoint(3, 3),
        QPoint(-3, 3),
        QPoint(0, -70)
    };
    static const QPoint secondHand[3]{
        QPoint(2, 2),
        QPoint(-2, 2),
        QPoint(0, -90)
    };
    int side = qMin(width(), height());
    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing); //防止走样
    painter.translate(width()/2, height()/2);
    painter.scale(side/250.0, side/250.0);
    //绘制表盘刻度
    for(int i=0; i<60; ++i)
    {
        if((i%5) != 0)
        {
            //painter.setPen(Qt::NoPen);
            painter.setPen(QPen(Qt::black, 1, Qt::DashLine, Qt::FlatCap, Qt::MiterJoin));
            //painter.setBrush(Qt::yellow);
            painter.drawLine(92, 0, 96, 0);
        }
        else
        {
            //painter.setPen(Qt::NoPen);
            painter.setPen(QPen(Qt::red, 2, Qt::DashLine, Qt::FlatCap, Qt::MiterJoin));
            //painter.setBrush(Qt::black);
            painter.drawLine(86, 0, 96, 0);
        }
        painter.rotate(6.0);
    }

    QTime time = QTime::currentTime(); //当前时间

    //Draw hour hand 时针
    painter.save(); //保持painter状态
    painter.rotate((time.hour() * 360)/12);
    painter.setPen(Qt::NoPen);
    painter.setBrush(Qt::red);
    painter.drawConvexPolygon(hourHand, 4);
    painter.restore(); //恢复painter状态
    //Draw minute hand 分针
    painter.save(); //保持painter状态
    painter.rotate((time.minute()*360)/60);
    painter.setPen(Qt::NoPen);
    painter.setBrush(Qt::green);
    painter.drawConvexPolygon(minuteHand, 3);
    painter.restore(); //恢复painter状态
    //Draw second hand 秒针
    painter.save(); //保持painter状态
    painter.rotate((time.second()*360)/60);
    painter.setPen(Qt::NoPen);
    painter.setBrush(Qt::blue);
    painter.drawConvexPolygon(secondHand, 3);
    painter.restore(); //恢复painter状态

}

在构造函数上设定时钟

ClockDialog::ClockDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::ClockDialog)
{
    ui->setupUi(this);

    QTimer *timer = new QTimer(this);
    timer->start(1000);
    connect(timer, &QTimer::timeout, this, &ClockDialog::updateWindow);
}

在updateWindow上更新界面

void ClockDialog::updateWindow()
{
    this->update();
}

完整代码

ClockDialog.h

#ifndef CLOCKDIALOG_H
#define CLOCKDIALOG_H

#include <QDialog>

#include <QTime>
#include <QTimer>
#include <QPainter>

namespace Ui {
class ClockDialog;
}

class ClockDialog : public QDialog
{
    Q_OBJECT

public:
    explicit ClockDialog(QWidget *parent = nullptr);
    ~ClockDialog();
    virtual void paintEvent(QPaintEvent* event);

public slots:
    void updateWindow();

private:
    Ui::ClockDialog *ui;
};

#endif // CLOCKDIALOG_H

ClockDialog.cpp

#include "clockdialog.h"
#include "ui_clockdialog.h"

ClockDialog::ClockDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::ClockDialog)
{
    ui->setupUi(this);

    QTimer *timer = new QTimer(this);
    timer->start(1000);
    connect(timer, &QTimer::timeout, this, &ClockDialog::updateWindow);
}

ClockDialog::~ClockDialog()
{
    delete ui;
}

void ClockDialog::paintEvent(QPaintEvent *event)
{
    static const QPoint hourHand[4]{
        QPoint(4, 4),
        QPoint(-4, 4),
        QPoint(-4, -40),
        QPoint(4, -40)
    };
    static const QPoint minuteHand[3]{
        QPoint(3, 3),
        QPoint(-3, 3),
        QPoint(0, -70)
    };
    static const QPoint secondHand[3]{
        QPoint(2, 2),
        QPoint(-2, 2),
        QPoint(0, -90)
    };
    int side = qMin(width(), height());
    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing); //防止走样
    painter.translate(width()/2, height()/2);
    painter.scale(side/250.0, side/250.0);
    //绘制表盘刻度
    for(int i=0; i<60; ++i)
    {
        if((i%5) != 0)
        {
            //painter.setPen(Qt::NoPen);
            painter.setPen(QPen(Qt::black, 1, Qt::DashLine, Qt::FlatCap, Qt::MiterJoin));
            //painter.setBrush(Qt::yellow);
            painter.drawLine(92, 0, 96, 0);
        }
        else
        {
            //painter.setPen(Qt::NoPen);
            painter.setPen(QPen(Qt::red, 2, Qt::DashLine, Qt::FlatCap, Qt::MiterJoin));
            //painter.setBrush(Qt::black);
            painter.drawLine(86, 0, 96, 0);
        }
        painter.rotate(6.0);
    }

    QTime time = QTime::currentTime(); //当前时间

    //Draw hour hand 时针
    painter.save(); //保持painter状态
    painter.rotate((time.hour() * 360)/12);
    painter.setPen(Qt::NoPen);
    painter.setBrush(Qt::red);
    painter.drawConvexPolygon(hourHand, 4);
    painter.restore(); //恢复painter状态
    //Draw minute hand 分针
    painter.save(); //保持painter状态
    painter.rotate((time.minute()*360)/60);
    painter.setPen(Qt::NoPen);
    painter.setBrush(Qt::green);
    painter.drawConvexPolygon(minuteHand, 3);
    painter.restore(); //恢复painter状态
    //Draw second hand 秒针
    painter.save(); //保持painter状态
    painter.rotate((time.second()*360)/60);
    painter.setPen(Qt::NoPen);
    painter.setBrush(Qt::blue);
    painter.drawConvexPolygon(secondHand, 3);
    painter.restore(); //恢复painter状态

}

void ClockDialog::updateWindow()
{
    this->update();
}

运行界面如下:

多谢,亲爱的美美。

猜你喜欢

转载自blog.csdn.net/islinyoubiao/article/details/113754404