全部代码
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/300da6daf85fc1c255b88bc3f980ffc3.png)
#ifndef DIALCLOCK_H
#define DIALCLOCK_H
#include <QWidget>
#include <QPainter>
class DialClock : public QWidget
{
Q_OBJECT
public:
explicit DialClock(QWidget *parent = nullptr);
signals:
public slots:
void SetupClockTime(float aValue);
protected:
void paintEvent(QPaintEvent *event);
private:
float m_roateValue;
};
#endif
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a81c2e23f381a84e3cefd514c27ce8d0.png)
#include "dialclock.h"
#include <QDebug>
#define DIALCLOCK_STARTX 75
#define DIALCLOCK_STARTY 188
#define DIALCLOCK_WIDTH 285
#define DIALCLOCK_HEIGHT 285
#define NEEDLE_WIDTH 26
#define NEEDLE_HEIGHT 90
DialClock::DialClock(QWidget *parent) : QWidget(parent)
{
setGeometry(DIALCLOCK_STARTX,DIALCLOCK_STARTY,DIALCLOCK_WIDTH,DIALCLOCK_HEIGHT);
setStyleSheet("background-color:RGB(0,0,0,0)");
m_roateValue=0.0;
}
void DialClock::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event)
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setRenderHint(QPainter::SmoothPixmapTransform,true);
painter.save();
painter.drawPixmap(rect(),QPixmap(":/images/ImageResources/dial.png"));
painter.restore();
painter.save();
painter.translate(width()/2,height()/2);
painter.rotate(m_roateValue);
painter.drawPixmap(-13,-80,NEEDLE_WIDTH,NEEDLE_HEIGHT,QPixmap(":/images/ImageResources/needle.png"));
painter.restore();
}
void DialClock::SetupClockTime(float aValue)
{
m_roateValue=360*aValue;
repaint();
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7620177060a0f21a52bff6a53e0b63dd.png)
#ifndef RULER_H
#define RULER_H
#include <QWidget>
#include <QPainter>
#include "rulerheader.h"
class RulerHeader;
class Ruler : public QWidget
{
Q_OBJECT
public:
explicit Ruler(QWidget *parent = nullptr);
virtual ~Ruler();
signals:
void rulerStrechSignal(float value);
void rulerDoneSignal(float value);
private:
RulerHeader *m_rulerHeader;
QPoint m_orignalPosistion;
int m_currentPosY;
private slots:
void OnRulerHeaderMove(int aValue);
void OnulerHeaderRelase();
protected:
void paintEvent(QPaintEvent *event);
public:
void SetRulerReset();
void UpdateRulerHight(float aValue);
};
#endif
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2d651a8a71136ab487b46c1166cfd024.png)
#include "ruler.h"
#include "rulerheader.h"
#include <QDebug>
#define RULERWIDGHT_STARTX 351
#define RULERWIDGHT_STARTY 100
#define RULER_WIDTH 82
#define RULER_HIGHT 574
#define RULER_MAX_HEIGHT 486
Ruler::Ruler(QWidget *parent) : QWidget(parent)
{
setGeometry(RULERWIDGHT_STARTX,RULERWIDGHT_STARTY,RULER_WIDTH,RULER_HIGHT);
setStyleSheet("background-color:RGB(0,0,0,0)");
m_rulerHeader=new RulerHeader(this);
connect(m_rulerHeader,SIGNAL(RulerHeaderMoveSignal(int)),this,SLOT(OnRulerHeaderMove(int)));
connect(m_rulerHeader,SIGNAL(RulerHeaderRelaseSignal()),this,SLOT(OnulerHeaderRelase()));
m_orignalPosistion=m_rulerHeader->pos();
m_currentPosY=0;
}
Ruler::~Ruler()
{
if(m_rulerHeader!=NULL)
{
delete m_rulerHeader;
m_rulerHeader=NULL;
}
}
void Ruler::OnRulerHeaderMove(int aValue)
{
if(m_rulerHeader==NULL)
{
return;
}
int realPosY=aValue+m_currentPosY;
if((realPosY<=RULER_MAX_HEIGHT) &&(realPosY >= 0))
{
m_rulerHeader->move(m_orignalPosistion.rx(),realPosY);
}
float dialRation=m_rulerHeader->pos().y()/486.0;
emit rulerStrechSignal(dialRation);
repaint();
}
void Ruler::OnulerHeaderRelase()
{
m_currentPosY=m_rulerHeader->pos().ry();
float dialRation=m_rulerHeader->pos().y()/486.0;
emit rulerDoneSignal(dialRation);
}
void Ruler::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.save();
painter.setPen(QPen(QColor(127,159,124),1));
painter.setBrush(QColor(Qt::red));
painter.drawRect(15,3,52,m_rulerHeader->pos().y());
painter.restore();
int sScale=5;
int lScale=25;
int CurrentRulerHeight=m_rulerHeader->pos().y();
int sScale_count=CurrentRulerHeight/sScale+1;
int lScale_count=CurrentRulerHeight/lScale+1;
painter.setPen(QPen(QColor(0,0,0),1));
for(int i=0;i<sScale_count;i++)
{
if(i%5!=0)
{
painter.drawLine(QPoint(67-5,5*i),QPoint(67,5*i));
}
}
for(int i=0;i<lScale_count;i++)
{
painter.drawLine(QPoint(67-10,25*i),QPoint(67,25*i));
}
}
void Ruler::SetRulerReset()
{
m_rulerHeader->move(m_orignalPosistion.rx(),0);
m_currentPosY=0;
repaint();
}
void Ruler::UpdateRulerHight(float aValue)
{
int currentY=aValue*RULER_MAX_HEIGHT;
m_rulerHeader->move(m_orignalPosistion.rx(),currentY);
repaint();
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2132cd5c6f50bd1f56b381570c7fa9c8.png)
#ifndef RULERHEADER_H
#define RULERHEADER_H
#include <QWidget>
#include <QMouseEvent>
#include <QPaintEvent>
#include <QPainter>
#include <QPixmap>
#include <QDebug>
class RulerHeader : public QWidget
{
Q_OBJECT
public:
explicit RulerHeader(QWidget *parent = nullptr);
virtual ~RulerHeader();
signals:
void RulerHeaderMoveSignal(int posY);
void RulerHeaderRelaseSignal();
private:
QPoint last_mouse_position;
protected:
void mouseReleaseEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *event);
};
#endif
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b1215cff8f76f0da37db10b342f9db6e.png)
#include "rulerheader.h"
#include <QDebug>
#define RULERHEADER_WIDTH 82
#define RULERHEADER_HEIGHT 91
RulerHeader::RulerHeader(QWidget *parent) : QWidget(parent)
{
setGeometry(0,0,RULERHEADER_WIDTH,RULERHEADER_HEIGHT);
}
RulerHeader::~RulerHeader()
{
}
void RulerHeader::mousePressEvent(QMouseEvent *event)
{
if(event->button()==Qt::LeftButton)
{
last_mouse_position=event->globalPos();
}
}
void RulerHeader::mouseMoveEvent(QMouseEvent *event)
{
if(event->buttons()&Qt::LeftButton)
{
QPoint position=event->globalPos()-last_mouse_position;
emit RulerHeaderMoveSignal(position.y());
}
}
void RulerHeader::mouseReleaseEvent(QMouseEvent *event)
{
Q_UNUSED(event);
emit RulerHeaderRelaseSignal();
}
void RulerHeader::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.save();
painter.drawPixmap(rect(),QPixmap(":/images/ImageResources/ruler_head.png"));
painter.restore();
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6a0a78948bd1d55ec03ab337c560eeb4.png)
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
#include <QPixmap>
#include <QDesktopWidget>
#include <QLabel>
#include <QTimer>
#include <QPushButton>
#include "ruler.h"
#include "dialclock.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Ruler;
class DialClock;
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
public:
void loadFrontWidget();
QString caculateFormateTimeWithSecond(int aSeconds);
private:
Ruler* m_ruler;
DialClock* m_dialClock;
QLabel *m_pTimeLabel;
QTimer *m_pCountDwonTimer;
int m_nRulerStettedSecond;
QPushButton *m_pPlayButton;
QPushButton *m_pResetButton;
bool m_TimerPlaying;
private slots:
void OnRulerStrechDone(float aValue);
void OnCountDownTimerProcess();
void OnPlayButtonClicked();
void OnResetButtonClicked();
protected:
void paintEvent(QPaintEvent *event);
};
#endif
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c3292e0a501eb835178e05839aa2f565.png)
#include "widget.h"
#include "ui_widget.h"
#include "ruler.h"
#include "dialclock.h"
#include <QFont>
#define WITDH 433
#define HEIGHT 755
#define TOOLBUTTON_WIDTH 100
#define TOOLBUTTON_HEIGHT 100
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
setWindowFlags(windowFlags() & ~Qt::WindowMinMaxButtonsHint);
setMinimumSize(WITDH,HEIGHT);
setMaximumSize(WITDH,HEIGHT);
setAutoFillBackground(true);
QDesktopWidget* desktop=QApplication::desktop();
int startX=(desktop->width()-WITDH)/2;
int startY=(desktop->height()-HEIGHT)/2;
setGeometry(startX,startY,WITDH,HEIGHT);
loadFrontWidget();
m_pCountDwonTimer=new QTimer(this);
m_nRulerStettedSecond=0;
connect(m_pCountDwonTimer,SIGNAL(timeout()),this,SLOT(OnCountDownTimerProcess()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::loadFrontWidget()
{
m_ruler=new Ruler(this);
m_dialClock=new DialClock(this);
connect(m_ruler,SIGNAL(rulerStrechSignal(float)),m_dialClock,SLOT(SetupClockTime(float)));
connect(m_ruler,SIGNAL(rulerDoneSignal(float)),this,SLOT(OnRulerStrechDone(float)));
QFont font;
font.setFamily("PingFang TC");
font.setWeight(25);
font.setPixelSize(35);
m_pTimeLabel=new QLabel(this);
m_pTimeLabel->setGeometry(138,525,160,60);
m_pTimeLabel->setFont(font);
m_pTimeLabel->setStyleSheet("background:transparent;color:#d16b5d");
m_pTimeLabel->setAlignment(Qt::AlignCenter);
m_pTimeLabel->setText("00:00");
m_pPlayButton=new QPushButton(this);
m_pPlayButton->setGeometry(111,630,TOOLBUTTON_WIDTH,TOOLBUTTON_HEIGHT);
m_pPlayButton->setIcon(QIcon(":/images/ImageResources/play.png"));
m_pPlayButton->setIconSize(QSize(TOOLBUTTON_WIDTH,TOOLBUTTON_HEIGHT));
m_pPlayButton->setAutoFillBackground(true);
m_pPlayButton->setFlat(true);
m_pPlayButton->setStyleSheet("QPushButton{background:transparent}");
m_TimerPlaying=false;
connect(m_pPlayButton,SIGNAL(clicked(bool)),this,SLOT(OnPlayButtonClicked()));
m_pResetButton=new QPushButton(this);
m_pResetButton->setGeometry(251,630,TOOLBUTTON_WIDTH,TOOLBUTTON_HEIGHT);
m_pResetButton->setIcon(QIcon(":/images/ImageResources/reset.png"));
m_pResetButton->setIconSize(QSize(TOOLBUTTON_WIDTH,TOOLBUTTON_HEIGHT));
m_pResetButton->setAutoFillBackground(true);
m_pResetButton->setFlat(true);
m_pResetButton->setStyleSheet("QPushButton{background:transparent}");
connect(m_pResetButton,SIGNAL(clicked(bool)),this,SLOT(OnResetButtonClicked()));
}
void Widget::OnRulerStrechDone(float aValue)
{
int mSeconds=(int)3600 * aValue;
QString formateTime=caculateFormateTimeWithSecond(mSeconds);
m_pTimeLabel->setText(formateTime);
m_nRulerStettedSecond=mSeconds;
if(m_pCountDwonTimer->isActive())
{
m_pCountDwonTimer->stop();
}
m_pCountDwonTimer->start(100);
}
QString Widget::caculateFormateTimeWithSecond(int aSeconds)
{
int tMinutes=aSeconds/60;
int tSeconds=aSeconds-tMinutes*60;
QString strMinutes=QString("%1").arg(tMinutes);
QString strSeconds=QString("%1").arg(tSeconds);
if((tMinutes<10)&&(tMinutes>=0))
{
strMinutes=QString("0%1").arg(tMinutes);
}
if(tSeconds<10&&tSeconds>0)
{
strSeconds=QString("0%1").arg(tSeconds);
}
QString formateTime=QString("%1:%2").arg(tMinutes).arg(tSeconds);
return formateTime;
}
void Widget::OnCountDownTimerProcess()
{
if(m_nRulerStettedSecond<=0)
{
OnResetButtonClicked();
}
QString formateTime=caculateFormateTimeWithSecond(m_nRulerStettedSecond);
m_pTimeLabel->setText(formateTime);
float currentRatio=m_nRulerStettedSecond/3600.0;
m_ruler->UpdateRulerHight(currentRatio);
m_nRulerStettedSecond--;
}
void Widget::OnPlayButtonClicked()
{
if(m_TimerPlaying==true)
{
if(m_pCountDwonTimer->isActive())
{
m_pCountDwonTimer->stop();
m_TimerPlaying=false;
}
m_pResetButton->setIcon(QIcon(":/images/ImageResources/reset.png"));
}
else{
m_pCountDwonTimer->start(1000);
m_TimerPlaying=true;
m_pPlayButton->setIcon(QIcon(":/images/ImageResources/pause.png"));
}
}
void Widget::OnResetButtonClicked()
{
if(m_TimerPlaying==true)
{
if(m_pCountDwonTimer->isActive())
{
m_pCountDwonTimer->stop();
}
}
m_pPlayButton->setIcon(QIcon(":/images/ImageResources/play.png"));
m_TimerPlaying=false;
m_nRulerStettedSecond=0;
m_pTimeLabel->setText("00:00");
m_dialClock->SetupClockTime(0.0);
m_ruler->SetRulerReset();
}
void Widget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
painter.save();
painter.setRenderHint(QPainter::Antialiasing,true);
painter.drawPixmap(rect(),QPixmap(":/images/ImageResources/background.png"));
painter.restore();
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3c4092215068ef0464627a9a27d5a589.png)