Qt实战案例(23)——利用QProgressBar实现彩色进度条

一、项目介绍

利用QProgressBar实现彩色进度条,利用一个彩色渐变背景图,通过QImage获取背景图的颜色,然后来设置进度条QProgressBar,便可以实现动态彩色进度条(根据图片设定颜色)。

二、项目基本配置

新建一个Qt案例,项目名称为“ProgressBarTest”,基类选择“QWidget”,取消创建UI界面复选框的选中状态,完成项目创建。

三、UI界面设计

无UI界面

四、主程序实现

首先需要添加资源文件,这里添加资源文件image/1.png。添加资源文件的方法这里不进行详细介绍,不懂的可以自行查阅相关资料。

4.1 widget.h头文件

声明四个变量:进度条、标签、滑动条、图片:

public:
    QProgressBar *m_bar;
    QLabel       *m_value;
    QSlider      *m_slider;
    QImage       *m_image;

然后声明一个槽函数:

protected slots:
    void  onvalueChanged(int value);

4.2 widget.cpp源文件

核心代码如下:

{
    m_bar=new QProgressBar(this);
    m_value=new QLabel(this);
    m_slider=new QSlider(this);
    m_image->load(":/image/1.png");


    m_bar->setMaximum(100);//进度条最大值
    m_bar->setMinimum(0);  //进度条最小值
    m_bar->setValue(0);    //进度条当前值
    m_bar->setTextVisible(false);//不显示当前已完成百分比
    m_bar->setFixedHeight(20);//固定高度

    m_slider->setMaximum(100);//弹簧最大值
    m_slider->setMinimum(0);  //弹簧最小值
    m_slider->setValue(0);    //弹簧当前值
    m_slider->setOrientation(Qt::Horizontal);//弹簧为水平方向

    m_value->setText(QString("%1%").arg(m_bar->value()));//进度条数值
    m_value->setAlignment(Qt::AlignRight|Qt::AlignVCenter);//水平居右垂直居中
    m_value->setMinimumWidth(40);   //进度条最小宽度

     /*设置布局*/
    //弹簧和label水平布局
     QHBoxLayout* hlayout = new QHBoxLayout();
     hlayout->addWidget(m_slider);
     hlayout->addWidget(m_value,0,Qt::AlignRight);

     //进度条和上面的垂直布局
     QVBoxLayout* vlayout = new QVBoxLayout();
     vlayout->addWidget(m_bar);
     vlayout->addLayout(hlayout);
     setLayout(vlayout);//保存布局

     connect(m_slider,SIGNAL(valueChanged(int)),m_bar,SLOT(setValue (int)));//弹簧改变槽函数
     connect(m_bar,SIGNAL(valueChanged(int)),this,SLOT(onvalueChanged (int)));//进度条改变槽函数

     onvalueChanged(m_bar->value());//改变样式
}

定义进度条数值变化对应的槽函数:

void Widget::onvalueChanged(int value)
{
    QString qss= "QProgressBar{"
               "border: 1px solid rgb(16, 135, 209);"
               "background: rgba(248,248,255,180);"
               "border-radius: 6px; }"
               "QProgressBar::chunk:enabled {"
               "border-radius: 4px; "
               "background: qlineargradient(x1:0, y1:0, x2:1, y2:0" ;

    double v = m_bar->maximum();
    double EndColor=static_cast<double>(value)/v ;    //获取比例

    for(int i=0;i<100;i++)
    {
     double Current = EndColor*i/100;
     QRgb rgb = m_image->pixel((m_image->width()-1)*Current,m_image->height()/2);
     QColor c(rgb);
     qss.append(QString(",stop:%1  rgb(%2,%3,%4)").arg(i/100.0).arg(c.red()).arg(c.green()).arg(c.blue()));
    }

    qss.append(");}");
    qDebug()<<qss;
    m_bar->setStyleSheet(qss);
    m_value->setText(QString("%1%").arg(m_bar->value()));
}

五、效果演示

效果如下:
在这里插入图片描述
如果没有看懂的话,完整代码可以参考:
https://download.csdn.net/download/didi_ya/75646229
当然,也可以将该文件封装为一个类,这里封装为class ProgressBar,有需要的也可以参考:资源


ok,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~

下面是多线程 QProgressBar 实现进度条的示例代码: ```python from PyQt5.QtCore import QThread, pyqtSignal from PyQt5.QtWidgets import QApplication, QWidget, QProgressBar, QPushButton, QVBoxLayout import time class Worker(QThread): progress_updated = pyqtSignal(int) def run(self): for i in range(101): time.sleep(0.1) self.progress_updated.emit(i) class MainWindow(QWidget): def __init__(self): super().__init__() self.progress_bar = QProgressBar() self.start_button = QPushButton("Start") self.start_button.clicked.connect(self.start_worker) layout = QVBoxLayout() layout.addWidget(self.progress_bar) layout.addWidget(self.start_button) self.setLayout(layout) self.worker = Worker() self.worker.progress_updated.connect(self.update_progress) def start_worker(self): self.worker.start() def update_progress(self, value): self.progress_bar.setValue(value) if __name__ == "__main__": app = QApplication([]) main_window = MainWindow() main_window.show() app.exec_() ``` 在这个示例中,我们创建了一个 `Worker` 类,它继承自 `QThread` 类。在 `Worker` 类中,我们定义了一个 `progress_updated` 信号,用于在进度更新时发射信号。在 `run` 方法中,我们使用一个循环模拟了一个长时间的任务,并且在每次循环中都让线程休眠了一小段时间。在循环中,我们发射了 `progress_updated` 信号,并且将当前进度作为参数传递。 在 `MainWindow` 类中,我们创建了一个 `QProgressBar` 控件和一个 `QPushButton` 控件,用于启动线程。当用户点击 `Start` 按钮时,我们启动了 `Worker` 线程。我们还定义了一个 `update_progress` 方法,用于更新进度条的值。在 `MainWindow` 类的构造函数中,我们连接了 `Worker` 的 `progress_updated` 信号到 `update_progress` 方法。 最后,我们创建了一个 `QApplication` 实例,并且创建了一个 `MainWindow` 实例并显示。当用户关闭窗口时,`app.exec_()` 方法会返回并退出应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wendy_ya

您的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值