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

相关推荐
pen-ai12 分钟前
打通 Python 与 C++ 的参数传递机制
开发语言·c++·python
qq_4017004123 分钟前
Qt的.pro文件
开发语言·qt
qq_4017004128 分钟前
Qt 事件处理机制
java·数据库·qt
王老师青少年编程37 分钟前
信奥赛C++提高组csp-s之KMP算法详解
c++·kmp·字符串匹配·csp·信奥赛·csp-s·提高组
喵星人工作室37 分钟前
C++传说:神明之剑0.4.5装备机制彻底完成
开发语言·c++·游戏
秦jh_39 分钟前
【Qt】系统相关(下)
开发语言·qt
hqwest1 小时前
码上通QT实战18--监控页面10-获取设备数据
开发语言·qt·湿度·modbus功能码·寄存器地址·从站数据·0103
不会写代码的ys1 小时前
日志库封装(项目通用)
c++
星火开发设计1 小时前
C++ multiset 全面解析与实战指南
开发语言·数据结构·c++·学习·set·知识
一眼万里*e1 小时前
MavLink消息协议
c++