效果:
代码:
#ifndef TIMEPROGRESSSLIDER_H
#define TIMEPROGRESSSLIDER_H
#include <QWidget>
class TimeProgressSlider : public QWidget
{
Q_OBJECT
public:
TimeProgressSlider(QWidget *parent = nullptr);
~TimeProgressSlider()override;
protected:
void paintEvent(QPaintEvent *event)override;
void mousePressEvent(QMouseEvent *event)override;
void mouseReleaseEvent(QMouseEvent *event)override;
void mouseMoveEvent(QMouseEvent *event)override;
private:
QString digitalToTime(int sec);
int sec{600};
int currentSec{0};
QRect textRect;
bool isPress{false};
};
#endif // TIMEPROGRESSSLIDER_H
#include "timeprogressslider.h"
#include <QPainter>
#include <QPaintEvent>
#include <QDebug>
TimeProgressSlider::TimeProgressSlider(QWidget *parent)
: QWidget(parent)
{
setPalette(Qt::white);
setMinimumSize(250,60);
}
TimeProgressSlider::~TimeProgressSlider()
{
}
QString TimeProgressSlider::digitalToTime(int sec)
{
int h = sec / 3600;
int m = sec % 3600 / 60;
int s = sec % 60;
return QString("%1:%2").arg(h * 60 + m).arg(s);
}
void TimeProgressSlider::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,true);
auto rect = event->rect();
QRect centerFrayLineRect = QRect(0,(rect.height() - 6) / 2,rect.width(),6);
painter.save();
painter.setPen(Qt::transparent);
painter.setBrush(QColor("#c6c6c6"));
painter.drawRoundedRect(centerFrayLineRect,3,3);
painter.restore();
QFont font = this->font();
font.setPointSize(16);
painter.setFont(font);
QString showString = QString("%1/%2").arg(digitalToTime(currentSec)).arg(digitalToTime(sec));
textRect = painter.boundingRect(QRect(0,centerFrayLineRect.center().y(),0,0),Qt::AlignLeft | Qt::AlignVCenter,showString);
auto efficientAllWidth = rect.width() - textRect.width();
auto efficientWidth = efficientAllWidth * currentSec / sec;
textRect.moveLeft(efficientWidth);
centerFrayLineRect.setWidth(efficientWidth);
painter.save();
painter.setPen(Qt::transparent);
painter.setBrush(QColor("#800080"));
painter.drawRoundedRect(centerFrayLineRect,3,3);
painter.restore();
painter.save();
painter.setBrush(QColor("#020202"));
painter.drawRoundedRect(textRect,6,6);
painter.setPen(QPen(Qt::white,5));
painter.drawText(textRect,showString);
painter.restore();
}
void TimeProgressSlider::mousePressEvent(QMouseEvent *event)
{
if(textRect.contains(event->pos()))
{
isPress = true;
}
else
{
currentSec = event->x() * sec / (rect().width() - textRect.width());
if(currentSec > sec)
{
currentSec = sec;
}
else if(currentSec < 0)
{
currentSec = 0;
}
update();
}
QWidget::mousePressEvent(event);
}
void TimeProgressSlider::mouseReleaseEvent(QMouseEvent *event)
{
isPress = false;
QWidget::mouseReleaseEvent(event);
}
void TimeProgressSlider::mouseMoveEvent(QMouseEvent *event)
{
if(isPress)
{
currentSec = (event->x()) * sec / (rect().width() - textRect.width());
if(currentSec > sec)
{
currentSec = sec;
}
else if(currentSec < 0)
{
currentSec = 0;
}
update();
}
QWidget::mouseMoveEvent(event);
}