Qt:自定义进度条

来源:互联网 发布:日历制作软件 编辑:程序博客网 时间:2024/05/27 12:20

头文件:

floatwindows.h

#ifndef FLOATWINDOWS_H#define FLOATWINDOWS_H#include <QWidget>#include <QtGui>class FloatWindows : public QWidget{    Q_OBJECTpublic:    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_OBJECTpublic:    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_OBJECTpublic:    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;}
设计界面:

运行效果: