Skip to content

Instantly share code, notes, and snippets.

@alpham
Created September 7, 2013 15:57
Show Gist options
  • Save alpham/6476756 to your computer and use it in GitHub Desktop.
Save alpham/6476756 to your computer and use it in GitHub Desktop.
OvenTimer example on Qt 2D Graphics painting using QPainter, QPen, QBrush, and QGradient classes
#include "oventimerwidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
OvenTimerWidget w;
w.show();
return a.exec();
}
#include "oventimerwidget.h"
#include "ui_oventimerwidget.h"
#include <QTimer>
#include <QMouseEvent>
#include <QPaintEvent>
#include <QPainter>
#include <math.h>
const double DegreesPerMinute = 7.0;
const double DegreesPerSecond = DegreesPerMinute / 60;
const int MaxMinutes = 45;
const int MaxSeconds = MaxMinutes * 60;
const int UpdateInterval = 5;
OvenTimerWidget::OvenTimerWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::OvenTimerWidget)
{
ui->setupUi(this);
finishTime = QDateTime::currentDateTime();
updateTimer = new QTimer(this);
connect(updateTimer,SIGNAL(timeout()),this,SLOT(update()));
finishTimer = new QTimer(this);
connect(finishTimer,SIGNAL(timeout()),this,SIGNAL(timeout()));
connect(finishTimer,SIGNAL(timeout()),updateTimer,SLOT(stop()));
QFont font;
font.setPointSize(8);
setFont(font);
}
OvenTimerWidget::~OvenTimerWidget()
{
delete ui;
}
void OvenTimerWidget::setDuration(int seconds)
{
seconds = qBound(0,seconds,MaxSeconds);
finishTime = QDateTime::currentDateTime().addSecs(seconds);
if(seconds > 0 ){
updateTimer->start(UpdateInterval * 1000);
finishTimer->start(seconds * 1000);
} else {
updateTimer->stop();
finishTimer->stop();
}
update();
}
int OvenTimerWidget::duration() const
{
int secs = QDateTime::currentDateTime().secsTo(finishTime);
if(secs < 0)
secs = 0;
return secs;
}
void OvenTimerWidget::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);
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->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);
}
}
void OvenTimerWidget::mousePressEvent(QMouseEvent *event)
{
QPointF point = event->pos() - rect().center();
double theta = atan2(-point.x(),-point.y()) * 180 / M_PI;
setDuration(duration() + int(theta / DegreesPerSecond));
update();
}
void OvenTimerWidget::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(-50, -50, 100, 100);
draw(&painter);
}
#ifndef OVENTIMERWIDGET_H
#define OVENTIMERWIDGET_H
#include <QWidget>
#include <QDateTime>
namespace Ui {
class OvenTimerWidget;
}
class OvenTimerWidget : public QWidget
{
Q_OBJECT
public:
explicit OvenTimerWidget(QWidget *parent = 0);
~OvenTimerWidget();
void setDuration(int seconds);
int duration() const;
void draw(QPainter *painter);
signals:
void timeout();
protected:
void paintEvent(QPaintEvent *event);
void mousePressEvent(QMouseEvent *event);
private:
Ui::OvenTimerWidget *ui;
QDateTime finishTime;
QTimer *updateTimer;
QTimer *finishTimer;
};
#endif // OVENTIMERWIDGET_H
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment