Qt编写自定义控件:时间进度滑动条

效果:

代码:

#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);
}

猜你喜欢

转载自blog.csdn.net/kenfan1647/article/details/120973625