QT5|C++|通过信号槽机制实现进度条更新

背景:最近在写一个删除90天数据显示进度的功能,实现思路是:通过信号槽捕获当前进度值实现。

cpp 复制代码
 备注:点击start按钮,开始更新进度条,直到100(每隔1s进行更新)

举个栗子:

1、mainwindow.cpp

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QThread>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(ui->pushButton,&QPushButton::clicked,this,&MainWindow::close);
    connect(ui->pushButton1,&QPushButton::clicked,this,&MainWindow::on_startProcess);

    void (MyThread::*rmsgSignal)(int) = &MyThread::msgSignal;
    connect(&thread,rmsgSignal,this,&MainWindow::on_setProcess);

    ui->progressBar->setRange(0,100);

}

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

//开启线程
void MainWindow::on_startProcess(){
    thread.start();

}

//设置进度条参数
void MainWindow::on_setProcess(int v){
    ui->progressBar->setValue(v);
}

2、mainwindow.h

cpp 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <mythread.h>

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    MyThread thread;

    void on_startProcess();
    void on_setProcess(int v);


private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

3、mythread.cpp

cpp 复制代码
#include "mythread.h"

MyThread::MyThread()
{

}

//重写run方法
void MyThread::run(){
    for(int i = 1;i<=100;i++){
        QThread::msleep(1000);
        emit msgSignal(i);
    }
}

4、MyThread.h

cpp 复制代码
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>


class MyThread: public QThread{
    Q_OBJECT
public:
    MyThread();
    void run() override;

signals:
    void msgSignal(int a);
};

#endif // MYTHREAD_H

5、main.cpp

cpp 复制代码
#include "mainwindow.h"

#include <QApplication>

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

6、mainwindow.ui

cpp 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QWidget" name="verticalLayoutWidget">
    <property name="geometry">
     <rect>
      <x>320</x>
      <y>140</y>
      <width>160</width>
      <height>80</height>
     </rect>
    </property>
    <layout class="QVBoxLayout" name="verticalLayout">
     <item>
      <widget class="QPushButton" name="pushButton">
       <property name="text">
        <string>close</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QPushButton" name="pushButton1">
       <property name="text">
        <string>start</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QProgressBar" name="progressBar">
       <property name="value">
        <number>0</number>
       </property>
       <property name="format">
        <string>%v%</string>
       </property>
      </widget>
     </item>
    </layout>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>23</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

7、结果

注:视频为测试结果,仅录制部分作为参考

ProgressBar

相关推荐
LNN20229 分钟前
Qt 5.8.0 下实现触摸屏热插拔功能的探索与实践(2)
开发语言·qt
-森屿安年-31 分钟前
二叉平衡树的实现
开发语言·数据结构·c++
Q741_1471 小时前
C++ 高精度计算的讲解 模拟 力扣67.二进制求和 题解 每日一题
c++·算法·leetcode·高精度·模拟
水木姚姚1 小时前
C++ begin
开发语言·c++·算法
꧁坚持很酷꧂1 小时前
Ubuntu系统下Qt程序连接串口设备没有问题,但运行时出现Permission denied的解决方法
linux·qt·ubuntu
老王熬夜敲代码2 小时前
泛型编程的差异抽象思想
开发语言·c++·笔记
hetao17338372 小时前
2025-12-02~03 hetao1733837的刷题记录
c++·算法
“愿你如星辰如月”2 小时前
C++11核心特性全解析
开发语言·c++
广都--编程每日问2 小时前
c++右键菜单统一转化文件为utf8编码
c++·windows·python
点云SLAM2 小时前
C++包装器之类型擦除(Type Erasure)包装器之小对象优化(SBO, Small Buffer Optimization)示例(5)
c++·内存管理·c++高级应用·c++包装器·类型擦除包装器·内存小对象优化