QT--源码实现烧烤箱表盘实现

43 篇文章 8 订阅
10 篇文章 0 订阅
//自定义画笔、绘制窗口、表盘绘制和渐近线操作

具体效果如下:间隔一秒自动旋转


/*------------头函数----------------*/
#ifndef OVENTIMER_H
#define OVENTIMER_H
 
#include <QDateTime>
#include <QtWidgets/QWidget>
 
#include <QTimer>
 
class OvenTimer : public QWidget
{
    Q_OBJECT
 
public:
    OvenTimer(QWidget *parent = 0);
 
    void setDuration(int secs);
    int duration() const;
    void draw(QPainter *painter);
 
signals:
    void timeout();
 
protected:
    void paintEvent(QPaintEvent *event);
    void mousePressEvent(QMouseEvent *event);
 
private:
    QDateTime finishTime;
    QTimer *updateTimer;
    QTimer *finishTimer;
};
 
#endif

/*------------原函数----------------*/
#include <QtGui>
#include <cmath>
#include<Qdebug>
#ifndef M_PI
#define M_PI 3.14159265359
#endif
 
#include "oventimer.h"
 
const double DegreesPerMinute = 7.0;
const double DegreesPerSecond = DegreesPerMinute / 60;
const int MaxMinutes = 45;
const int MaxSeconds = MaxMinutes * 60;
const int UpdateInterval = 1;
 
OvenTimer::OvenTimer(QWidget *parent)
    : QWidget(parent)
{
    finishTime = QDateTime::currentDateTime();
 
    updateTimer = new QTimer(this);
    connect(updateTimer, SIGNAL(timeout()), this, SLOT(update()));
 
    finishTimer = new QTimer(this);
    finishTimer->setSingleShot(true);
    connect(finishTimer, SIGNAL(timeout()), this, SIGNAL(timeout()));
    connect(finishTimer, SIGNAL(timeout()), updateTimer, SLOT(stop()));
 
    QFont font;
    font.setPointSize(8);
    setFont(font);
}
 
void OvenTimer::setDuration(int secs)
{
    secs = qBound(0, secs, MaxSeconds);
 
    finishTime = QDateTime::currentDateTime().addSecs(secs);
 
    if (secs > 0) {//设置几秒更新一次
        updateTimer->start(UpdateInterval * 1000);
        finishTimer->start(secs * 1000);
    } else {
        updateTimer->stop();
        finishTimer->stop();
    }
    update();
}
 
int OvenTimer::duration() const
{
    int secs = QDateTime::currentDateTime().secsTo(finishTime);
    if (secs < 0)
        secs = 0;
    return secs;
}
 
void OvenTimer::mousePressEvent(QMouseEvent *event)
{
    QPointF point = event->pos() - rect().center();
    double theta = std::atan2(-point.x(), -point.y()) * 180.0 / M_PI;
    setDuration(duration() + int(theta / DegreesPerSecond));
    update();
}
//每次的图形窗口改变都会调用此重新绘制函数
void OvenTimer::paintEvent(QPaintEvent * /* event */)
{
    QPainter painter(this);
    //设置反走样设置,减少边界的虚化
    painter.setRenderHint(QPainter::Antialiasing, true);
 
    int side = qMin(width(), height());
    qDebug() <<pos()<<endl;
    qDebug() <<width()<<endl;
    qDebug() <<height()<<endl;
//第一个参数用来显示画笔显示图形在窗口上的偏移
    painter.setViewport((width() - side) / 2, (height() - side) / 2,
                        side, side);
    //偏移中间这样就可以显示整个图形
    painter.setWindow(-50, -50, 100, 100);
 
    draw(&painter);
}
 
void OvenTimer::draw(QPainter *painter)
{
    static const int triangle[3][2] = {
        { -2, -49 }, { +2, -49 }, { 0, -47 }
    };
    QPen thickPen(palette().foreground(), 1.5);
    QPen thinPen(palette().foreground(), 0.5);
    QColor niceBlue(150, 150, 200);
 
    painter->setPen(thinPen);
    painter->setBrush(palette().foreground());
    //最上面的三角形 第一个画几个点,点的位置
    painter->drawPolygon(QPolygon(3, &triangle[0][0]));
 
    //设置背景渐变
    QConicalGradient coneGradient(0, 0, -90.0);
    coneGradient.setColorAt(0.0, Qt::darkGray);
    coneGradient.setColorAt(0.2, niceBlue);
    coneGradient.setColorAt(0.5, Qt::white);
    coneGradient.setColorAt(1.0, Qt::darkGray);
 
    painter->setBrush(coneGradient);
    painter->drawEllipse(-46, -46, 92, 92);
//四周变化组合
    QRadialGradient haloGradient(0, 0, 20, 0, 0);
    haloGradient.setColorAt(0.0, Qt::lightGray);
    haloGradient.setColorAt(0.8, Qt::darkGray);
    haloGradient.setColorAt(0.9, Qt::white);
    haloGradient.setColorAt(1.0, Qt::black);
 
    painter->setPen(Qt::NoPen);
    painter->setBrush(haloGradient);
    painter->drawEllipse(-20, -20, 40, 40);
//线性渐变具体参见博客:https://mp.csdn.net/postedit/80782701
    QLinearGradient knobGradient(-7, -25, 7, -25);
    knobGradient.setColorAt(0.0, Qt::black);
    knobGradient.setColorAt(0.2, niceBlue);
    knobGradient.setColorAt(0.3, Qt::lightGray);
    knobGradient.setColorAt(0.8, Qt::white);
    knobGradient.setColorAt(1.0, Qt::black);
 
    //painter自带的坐标系旋转类 返回60s  
    painter->rotate(duration() * DegreesPerSecond);
    //同样渐变线也要跟着动
    painter->setBrush(knobGradient);
    painter->setPen(thinPen);
    painter->drawRoundRect(-7, -25, 14, 50, 99, 49);
 
    for (int i = 0; i <= MaxMinutes; ++i) {
        if (i % 5 == 0) { //当为特殊时刻变粗
            //画圆盘
            painter->setPen(thickPen);
            painter->drawLine(0, -41, 0, -44);
            painter->drawText(-15, -41, 30, 30,
                              Qt::AlignHCenter | Qt::AlignTop,
                              QString::number(i));
        } else {
            painter->setPen(thinPen);
            painter->drawLine(0, -42, 0, -44);
        }
        painter->rotate(-DegreesPerMinute);
    }
}

/*----------main函数--------*/

#include <QtWidgets/QApplication>
 
#include "oventimer.h"
 
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    OvenTimer ovenTimer;
    ovenTimer.setWindowTitle(QObject::tr("Oven Timer"));
    ovenTimer.resize(300, 300);
    ovenTimer.show();
    return app.exec();
}
 

 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值