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

相关推荐
luj_17686 小时前
桥牌思维启示:系统设计的模块化架构
c语言·开发语言·c++·经验分享·算法
会周易的程序员7 小时前
aiDgePLC iec61131 虚拟机 完整使用文档
c++·物联网·架构·st·iec61131
小小龙学IT7 小时前
Boost.Beast 深度实战:基于 Asio 的开源 C++ HTTP/WebSocket 协议库
c++·websocket·http
不可求~8 小时前
C++ std::string_view 不是字符串:从悬空引用到安全用法
java·开发语言·c++
小小龙学IT9 小时前
C++ 正则表达式完全指南:从 std::regex 实战到 RE2 引擎原理(NFA/DFA/回溯陷阱)
c++·正则表达式
码匠许师傅12 小时前
【C++ 面试真题】聊聊 C++ 的序列容器
java·c++·面试
C++ 老炮儿的技术栈12 小时前
Qt5.9.1 Windows 完整开发环境搭建流程
开发语言·c++·windows·qt·编辑器·代码化
欧特克_Glodon13 小时前
OpenCV计算机视觉开发入门与实践<十一>:矩阵的复制和矩形类Rect
c++·opencv·计算机视觉·矩阵
键盘会跳舞13 小时前
C++:std::tuple 源码级深度拆解——变参模板、SFINAE与模板元编程核心技巧
开发语言·c++·sfinae·变参模板
bkspiderx13 小时前
从零开始:VS Code搭建C/C++开发环境全指南(Windows/macOS/Linux)
c语言·c++·windows·vs code·c/c++开发环境