Qt绘图练习-Clock

12 篇文章 0 订阅
这篇博客介绍了如何使用Qt库在C++中创建一个时钟应用,涵盖了Clock头文件、实现文件及主程序的编写过程。
摘要由CSDN通过智能技术生成

Clock.h

#ifndef CLOCK_H
#define CLOCK_H
#include <QWidget>
#include <QPoint>
#include <QTimer>
class Clock:public QWidget
{
    Q_OBJECT

    public:
        /** Default constructor */
        Clock(QWidget *parent = 0);
        /** Default destructor */
        virtual ~Clock();
    protected:
        void paintEvent(QPaintEvent *event);
    private:
        QTimer *timer;

};

#endif // CLOCK_H

Clock.cpp


#include "Clock.h"
#include <QPainter>
#include <QTime>

QPoint sec[4] = {QPoint(0, 10), QPoint(3, 0), QPoint(0, -90), QPoint(-3, 0)};
QPoint min[4] = {QPoint(0, 8), QPoint(5, 0), QPoint(0, -70), QPoint(-5, 0)};
QPoint hour[4] = {QPoint(0, 6), QPoint(7, 0), QPoint(0, -50), QPoint(-7, 0)};

Clock::Clock(QWidget *parent):QWidget(parent)
{
    //ctor
    resize(200, 200);
    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(update()));//update()会自动产生重绘消息,调用paintEvent()
    timer->start(1000);
}

Clock::~Clock()
{
    //dtor
}

void Clock::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    //painter.translate(100, 100);
    painter.setWindow(-100, -100, 200, 200);

    //绘制大刻度
    painter.save(); //save() 与 restore() 必须是一一对应的
    for (int i = 0; i < 60 ; ++i)
    {
        painter.rotate(6);  //rotate()是顺时针旋转坐标轴
        if (i % 5 == 4)
        {
            painter.setPen(QPen(Qt::black, 5));
            painter.drawLine(0, -90, 0, -100);
        }
        else
        {
            painter.setPen(QPen(Qt::black, 1));
            painter.drawLine(0, -95, 0, -100);
        }
    }
    painter.restore();

    int s = QTime::currentTime().second();
    int m = QTime::currentTime().minute();
    int h = QTime::currentTime().hour();

    painter.drawText(-20, 50, QTime::currentTime().toString());

    painter.save();
    painter.rotate(((h % 12) +  static_cast<double>(m / 60.0)) * 30);
    painter.setBrush(Qt::blue);
    painter.setPen(Qt::blue);
    painter.drawConvexPolygon(hour, 4);
    painter.restore();

    painter.save();
    painter.rotate(m * 6);
    painter.setBrush(Qt::green);
    painter.setPen(Qt::green);
    painter.drawConvexPolygon(min, 4);
    painter.restore();

    painter.save();
    painter.rotate(s * 6);
    painter.setBrush(Qt::red);
    painter.setPen(Qt::red);
    painter.drawConvexPolygon(sec, 4);
    painter.restore();
}



main.cpp

#include <QApplication>
#include "clock.h"

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

    Clock c;
    c.show();

    return app.exec();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值