3.7 倒计时计时器——全部代码

发布时间:2025-12-09 22:22:41 浏览次数:12

全部代码

#ifndef DIALCLOCK_H#define DIALCLOCK_H#include <QWidget>#include <QPainter>class DialClock : public QWidget{Q_OBJECTpublic:explicit DialClock(QWidget *parent = nullptr);signals:public slots:void SetupClockTime(float aValue);//aValue的值为信号函数传递的值protected:void paintEvent(QPaintEvent *event);private:float m_roateValue;//旋转值};#endif // DIALCLOCK_H #include "dialclock.h"#include <QDebug>#define DIALCLOCK_STARTX 75 //x#define DIALCLOCK_STARTY 188 //Y#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)");// setStyleSheet(QString("background-image:url(/images/ImageResources/dial.png);"// "background-repeat:no-repeat;"));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)//启动表盘槽函数{//qDebug()<<"Clock:"<<aValue;m_roateValue=360*aValue;repaint();//调用paintEvent()函数} #ifndef RULER_H#define RULER_H#include <QWidget>#include <QPainter>#include "rulerheader.h"class RulerHeader;class Ruler : public QWidget{Q_OBJECTpublic: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 // RULER_H #include "ruler.h"#include "rulerheader.h"#include <QDebug>//定义宽高,起点和终点#define RULERWIDGHT_STARTX 351 //定义X坐标#define RULERWIDGHT_STARTY 100 //定义Y坐标#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)");/* 测试 */// setAutoFillBackground(true);//自动填充背景// //设置颜色 测试// QPalette palette;// palette.setBrush(QPalette::Background,Qt::red);// setPalette(palette);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){//qDebug()<<"POSY"<<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);//不需要处理x轴}//表盘的比率=拉伸长度/最大长度float dialRation=m_rulerHeader->pos().y()/486.0;emit rulerStrechSignal(dialRation);repaint();//自动调用painterEvent}//尺子头释放(停止移动)的槽函数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);//event->rect();//绘制尺子QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);painter.save();//保存painter.setPen(QPen(QColor(127,159,124),1));painter.setBrush(QColor(Qt::red));// x y w hpainter.drawRect(15,3,52,m_rulerHeader->pos().y());painter.restore();//储存 使用save函数必须使用restore//数学测试// painter.save();//保存// painter.setPen(QPen(QColor(255,255,254),10));// painter.drawPoint(15,3);// painter.drawPoint(52,3);// painter.drawPoint(67,3);// 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)//不是5的倍数,防止和长线重合{//67=52+15// =w+xpainter.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;//秒数/3600 *最大长度==当前的高度m_rulerHeader->move(m_orignalPosistion.rx(),currentY);repaint();} #ifndef RULERHEADER_H#define RULERHEADER_H#include <QWidget>#include <QMouseEvent>#include <QPaintEvent>#include <QPainter>#include <QPixmap>#include <QDebug>class RulerHeader : public QWidget{Q_OBJECTpublic: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 // RULERHEADER_H #include "rulerheader.h"#include <QDebug>#define RULERHEADER_WIDTH 82#define RULERHEADER_HEIGHT 91RulerHeader::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());//返回Y坐标//qDebug()<<"mouse "<<position;}}void RulerHeader::mouseReleaseEvent(QMouseEvent *event){Q_UNUSED(event);emit RulerHeaderRelaseSignal();}void RulerHeader::paintEvent(QPaintEvent *event){//绘制尺子头Q_UNUSED(event);//不使用 event 指针QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);//设置抗锯齿painter.save();painter.drawPixmap(rect(),QPixmap(":/images/ImageResources/ruler_head.png"));painter.restore();//qDebug()<<"绘图完成";} #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_NAMESPACEnamespace Ui { class Widget; }QT_END_NAMESPACEclass Ruler;class DialClock;class Widget : public QWidget{Q_OBJECT//使用原对象系统public:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;public:void loadFrontWidget();//加载ruler和ruler headerQString caculateFormateTimeWithSecond(int aSeconds);//计算文本时间s为格式化的字符串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 // WIDGET_H #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 100Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget){ui->setupUi(this);setWindowFlags(windowFlags() & ~Qt::WindowMinMaxButtonsHint);//去除最大最小化按钮setMinimumSize(WITDH,HEIGHT);//设置窗口的最小值setMaximumSize(WITDH,HEIGHT);//设置窗口最大值setAutoFillBackground(true);//设置窗口填充//setAttribute(Qt::WA_TranslucentBackground);//设置透明窗体//设置窗口居中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()));// connect(m_pCountDwonTimer,&QTimer::timeout,[=](){// //计时器计时过程// if(m_nRulerStettedSecond<=0)//调用按钮重置// {// OnResetButtonClicked();// }// QString formateTime=caculateFormateTimeWithSecond(m_nRulerStettedSecond);// m_pTimeLabel->setText(formateTime);// //当时间变大时尺子高度会变短// float currentRatio=m_nRulerStettedSecond/3600.0;//秒数/3600// m_ruler->UpdateRulerHight(currentRatio);// m_nRulerStettedSecond--;// });}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,&QPushButton::clicked,[=](){// //重置按钮// 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);//设置槽函数的传递值为0// m_ruler->SetRulerReset();//调动尺子还原的函数// });connect(m_pResetButton,SIGNAL(clicked(bool)),this,SLOT(OnResetButtonClicked()));}void Widget::OnRulerStrechDone(float aValue)//拉伸释放{int mSeconds=(int)3600 * aValue;//3600s*表盘比率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))//例如09{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;//秒数/3600m_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);//设置槽函数的传递值为0m_ruler->SetRulerReset();//调动尺子还原的槽函数}//绘制窗口背景void Widget::paintEvent(QPaintEvent *event){Q_UNUSED(event);//没有使用eventQPainter painter(this);painter.save();//保存painter.setRenderHint(QPainter::Antialiasing,true);//设置反走样,抗锯齿painter.drawPixmap(rect(),QPixmap(":/images/ImageResources/background.png"));//rect()当前窗口painter.restore();//回复当前状态 save()必须后跟相应的restore()函数}
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477