天天看點

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:自定義進度條