天天看点

Qt:自定义进度条

头文件:

floatwindows.h

#ifndef FLOATWINDOWS_H
#define FLOATWINDOWS_H

#include <QWidget>
#include <QtGui>

class FloatWindows : public QWidget
{
    Q_OBJECT
public:
    explicit FloatWindows(QWidget *parent = 0);

signals:
    void clicked(int progress);
    void tracking(int progress, QPoint pos);
    void hightlight(bool states);

public:
    void setRange(int range);
    void setProgress(int progress);
    int Range() const;
    int Progress() const;

public slots:

private:
    QSize sizeHint() const;         //大小提示
    void enterEvent(QEvent *event);//鼠标移进
    void leaveEvent(QEvent *event);//鼠标移出
    void mouseMoveEvent(QMouseEvent *event);//鼠标移动
    void mousePressEvent(QMouseEvent *event);//鼠标点击
    void mouseReleaseEvent(QMouseEvent *event);//鼠标抬起
    void paintEvent(QPaintEvent *event);

private:
    int Postion_To_Progress(int postion);
    int Progress_To_Postion(int progress);

private:
    int m_Range;          //进度条范围
    int m_Progress;     //进度
    bool m_HightLight; //是否高亮状态
    bool m_Pressed;   //鼠标是否点击状态
};

#endif // FLOATWINDOWS_H
           

followwindows.h

#ifndef FOLLOWWINDOWS_H
#define FOLLOWWINDOWS_H

#include <QWidget>
#include <QtGui>

class FollowWindows : public QWidget
{
    Q_OBJECT
public:
    explicit FollowWindows(QWidget *parent = 0);
    void setText(const QString& text);

signals:

public slots:

private:
    void paintEvent(QPaintEvent *event);
    QString m_text;
};

#endif // FOLLOWWINDOWS_H
           

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "followwindows.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    int OnSeekHightLight(bool states);
    int OnSeekClicked(int progress);
    int OnSeekTracking(int progress,QPoint pos);

private:
    Ui::MainWindow *ui;
    FollowWindows *m_Tooltip;
};

#endif // MAINWINDOW_H
           

源文件:

floatwindows.cpp

#include "floatwindows.h"

FloatWindows::FloatWindows(QWidget *parent) :
    QWidget(parent)
{
    m_Range = 100;
    m_Progress = 0;

    m_HightLight = false;
    m_Pressed = false;

    setMouseTracking(true);//设置鼠标跟踪
    setCursor(Qt::PointingHandCursor);//设置光标为手型
}

void FloatWindows::setRange(int range)
{
    m_Range = range;
    update();
}

void FloatWindows::setProgress(int progress)
{
    m_Progress = progress;
    update();
}

int FloatWindows::Range() const
{
    return m_Range;
}

int FloatWindows::Progress() const
{
    return m_Progress;
}

QSize FloatWindows::sizeHint() const
{
    return QSize(100,20);
}

void FloatWindows::enterEvent(QEvent *event)
{
    m_HightLight = true;    //鼠标移进时,进度条高亮显示
    update();
    emit hightlight(true);
    QWidget::enterEvent(event);//调用父类函数保持原有行为
}

void FloatWindows::leaveEvent(QEvent *event)
{
    m_HightLight = false;
    update();
    emit hightlight(false);
    QWidget::leaveEvent(event);
}

void FloatWindows::mouseMoveEvent(QMouseEvent *event)
{
    int progress = Postion_To_Progress(event->pos().x());
    emit tracking( progress,event->pos() );
    QWidget::mouseMoveEvent(event);
}

void FloatWindows::mousePressEvent(QMouseEvent *event)
{
    if(event->buttons() == Qt::LeftButton)
    {
        m_Pressed = true;
    }
}

void FloatWindows::mouseReleaseEvent(QMouseEvent *event)
{
    if(m_Pressed)
    {
        m_Pressed = false;
        m_Progress = Postion_To_Progress(event->pos().x());
        update();
        emit clicked(m_Progress);
    }
}

void FloatWindows::paintEvent(QPaintEvent *event)
{
    QWidget::paintEvent(event);
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);//设置渲染,反锯齿

    int width = this->width()-20;
    int height = this->height();
    int middel = height/2;
    int ofset = 0;

    QColor colorLeft  = QColor(44, 143, 214);
    QColor colorRight = QColor(0x888888);
    QColor colorHandle = QColor(51, 153, 255);//小球背景色
    QColor colorHandleFrame = QColor(0xCCCCCC);

    int postion = ofset + m_Progress * width/m_Range;
    if(!m_HightLight)
    {
        //细线模式
        QPen pen;
        pen.setWidth(2);//线宽

        //左边
        pen.setColor(colorLeft);
        painter.setPen(pen);
        painter.drawLine(QPoint(0,middel),QPoint(postion,middel));

        //右边
        pen.setColor(colorRight);
        painter.setPen(pen);
        painter.drawLine(QPoint(postion,middel),QPoint(width,middel));

        //小圆球
        pen.setWidth(1);
        pen.setColor(colorHandleFrame);
        painter.setPen(pen);           //描线
        painter.setBrush(colorHandle);//背景填充色
        painter.drawEllipse(QPoint(postion+5,middel),5,5);//进度条上小球大小
    }
    else
    {
        //粗线模式
        QPen pen;
        pen.setWidth(4);//线宽

        //左边
        pen.setColor(colorLeft);
        painter.setPen(pen);
        painter.drawLine(QPoint(0,middel),QPoint(postion,middel));

        //右边
        pen.setColor(colorRight);
        painter.setPen(pen);
        painter.drawLine(QPoint(postion,middel),QPoint(width,middel));

        //粗线模式圆球变化
        pen.setWidth(1);
        pen.setColor(colorHandleFrame);
        painter.setPen(pen);           //描线
        painter.setBrush(colorHandle);//背景填充色

        int w = 20,h = 10;
        QRect rectHandel(postion,middel-h/2,w,h);
        //绘制圆角矩形
        painter.drawRoundedRect(rectHandel,4,4);//最后两个参数决定角的圆度
    }
}

int FloatWindows::Postion_To_Progress(int postion)
{
    int width = this->width()-20;
    int ofset = 10;
    postion -= ofset; //可不加这句,只是为了防止界面越界
    if(postion < 0)
    {
        postion = 0;
    }
    else
        if(postion > width)
        {
            postion = width;
        }

    return postion * m_Range/width;
}

int FloatWindows::Progress_To_Postion(int progress)
{
    int width = this->width()-20;
    int ofset = 10; //ofset可不加这句,只是为了防止界面越界

    return ofset + width*progress/m_Range;
}
           

followwindows.cpp

#include "followwindows.h"

FollowWindows::FollowWindows(QWidget *parent) :
    QWidget(parent)
{
    setWindowFlags(Qt::ToolTip);    //设置窗口为提示框
    setAttribute(Qt::WA_TranslucentBackground);//半透明
}

void FollowWindows::setText(const QString &text)
{
    m_text = text;
    update();
}

void FollowWindows::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);//设置渲染,反锯齿

    // 背景透明
    int w = width(), h = height();
    painter.setPen(QColor(0,0,0,0));
    painter.setBrush(QColor(0xFF,0xFF,0xFF,0xAA));
    //painter.setBrush(QColor(0xFF,0xFF,0xFF));
    painter.drawRect(0,0,w,h);

    // 显示文本:所选区域的大小
    QFont font = painter.font();
    font.setPixelSize(14);//字体显示大小
    painter.setFont(font);

    painter.setPen(QPen(QColor(0x33,0X33,0X33)));
    QRect textRect(0,0, w, h);
    painter.drawText(textRect, Qt::AlignCenter, m_text);
}
           

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
           

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    m_Tooltip = new FollowWindows(this);
    m_Tooltip->setFixedSize(60,20);
    m_Tooltip->hide();

    connect(ui->widget,SIGNAL(hightlight(bool)),
            this,SLOT(OnSeekHightLight(bool)));

    connect(ui->widget,SIGNAL(clicked(int)),
            this,SLOT(OnSeekClicked(int)));

    connect(ui->widget,SIGNAL(tracking(int,QPoint)),
            this,SLOT(OnSeekTracking(int,QPoint)));
}

MainWindow::~MainWindow()
{
    delete ui;
}

int MainWindow::OnSeekHightLight(bool states)
{
    m_Tooltip->setVisible(states);
    return 0;
}

int MainWindow::OnSeekClicked(int progress)
{
    Q_UNUSED(progress);//不引用
    return 0;
}

int MainWindow::OnSeekTracking(int progress, QPoint pos)
{
    char buf[64];
    sprintf(buf,"%d",progress);
    m_Tooltip->setText(buf);

    pos.setY(-25);
    pos.setX(pos.x()-30);
    pos = ui->widget->mapToGlobal(pos);//全局位置
    m_Tooltip->move(pos);

    return 0;
}
           

设计界面:

Qt:自定义进度条

运行效果:

Qt:自定义进度条