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

匿名 (未验证) 提交于 2019-12-03 00:34:01
//自定义画笔、绘制窗口、表盘绘制和渐近线操作 

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

 
/*------------头函数----------------*/
#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        
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!