QProgressDialog用法及结合QThread用法,四种线程使用

1 QProgressDialog概述

QProgressDialog类提供耗时操作的进度条。
进度对话框用于向用户指示操作将花费多长时间,并演示应用程序没有冻结。此外,QPorgressDialog还可以给用户一个中止操作的机会。
进度对话框的一个常见问题是很难知道何时使用它们;操作在不同的硬件上花费不同的时间。QProgressDialog为这个问题提供了一个解决方案:它估计操作将花费的时间(基于步骤的时间),并且仅在估计超过minimumDuration()(默认为4秒)时才显示它自己。
使用setMinimum()setMaximum()或构造函数设置操作中的“steps”数,并在操作进行时调用setValue()steps数可以任意选择。它可以是复制的文件数、接收的字节数、通过算法主循环的迭代次数,或者其他合适的单位。进度从setMinimum()设置的值开始,当使用setMaximum()设置的值作为参数调用setValue()时,进度对话框显示操作已经完成。
在操作结束时,对话框会自动重置并隐藏自己。使用setAutoReset()setAutoClose()来改变这种行为。
注意,如果设置了一个新的最大值(使用setMaximum()setRange()),它等于你的当前值(),无论如何对话框都不会关闭。

QProgressDialog progress;
progress.setMaximun(100);
Progress.setValue(100);

以上代码,对话框不会自动隐藏。
QProgressDialog有两种使用方式:模态和非模态。
与非模态QProgressDialog相比,模态QProgressDialog对于程序员来说更容易使用。在循环中执行操作,每隔一段时间调用setValue(),并使用wasCanceled()检查是否取消。
例如:

QProgressDialog progress("复制文件...", "中止", 0, numFiles, this);progress.setWindowModality(Qt::WindowModal);for (int i = 0; i < numFiles; i++) {progress.setValue(i);if (progress.wasCanceled())break;// 开始复制// ......}// 复制完成,将最大值设置给当前值,对话框自动隐藏,关闭progress.setValue(numFiles);

在这里插入图片描述

2 QProgressDialog常用函数

2.1 构造函数:

  • QProgressDialog(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags()):创建一个默认的进度对话框,parent是对话框的父部件,f是对话框的窗口标志。
  • QProgressDialog(const QString &labelText, const QString &cancelButtonText, int minimum, int maximum, QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags()):创建一个带有文本标签、取消按钮和进度范围的进度对话框。labelText是标签的文本,cancelButtonText是取消按钮的文本,minimum和maximum指定了进度的范围。

2.2 成员函数:

  • void cancel():重置进度对话框,将wasCanceled()标记为true,直到进度对话框被重置。进度对话框将隐藏起来。
  • void canceled():在点击取消按钮时发射的信号,默认与cancel()槽连接。
  • void open(QObject *receiver, const char *member):打开对话框,并将其canceled()信号连接到receiver对象的member槽上。
  • void reset():重置进度对话框,如果autoClose()为true,则对话框将隐藏。
  • void setBar(QProgressBar *bar):设置进度条部件。
  • void setCancelButton(QPushButton *cancelButton):设置取消按钮部件。
  • void setCancelButtonText(const QString &cancelButtonText):设置取消按钮的文本。
  • void setLabel(QLabel *label):设置标签部件。
  • void setRange(int minimum, int maximum):设置进度范围。
  • QSize sizeHint() const:返回适合对话框内容的大小。

2.3 常用方法示例代码

CustomProgress::CustomProgress(QWidget *parent) : QProgressDialog(parent)
{// 设置窗体Flags, 对话框 | 只有关闭按钮,无问号this->setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);// 设置取消按钮文本this->setCancelButtonText("取消");// 设置进度条区间,等同分别设置最小值  和  最大值setRange(0, 100);// 设置最小值setMinimum(0);// 设置最大值setMaximum(100);// 设置当前值setValue(0);// 设置文本,一般在进度条上方显示setLabelText("helloworld");// 设置自动关闭,当reset()时,对话框自动关闭,默认为truesetAutoClose(true);// 设置自动重置,当reset()或当前值 == 最大值时,重置setAutoReset(true);connect(this, &CustomProgress::canceled, this, &CustomProgress::cancel);// 设置对话框窗体标题this->setWindowTitle("等待...");
}

3 线程Qthread

当在主线程里,进行耗时操作,然后加载进度对话框时,会发现,对话框进度条会卡死不动,然后耗时操作结束,对话框进度条直接关闭,界面感官不友好。
因此需要将耗时操作放到线程内操作,主线程就进行进度显示。界面也不会卡死。

QThread类提供了一种独立于平台的方式来管理线程。
QThread对象管理程序中的一个控制线程。QThreadsrun()中开始执行。默认情况下,run()通过调用exec()启动事件循环,并在线程内运行Qt事件循环。

此外,还可以通过使用QObject::moveToThread()将工作对象移动到线程中来使用它们。

下面是四种线程使用方式与进度框相结合,模拟处理耗时操作,主界面显示进度。

3.1 继承QThread,重写run()方法

.h

class C_Thread : public QThread
{Q_OBJECT
public:explicit C_Thread(int nMax, QObject *parent = nullptr);virtual void run() override;signals:void emit_sendValue(int nValue);private:int     m_nMax;
};

.cpp

#include "Thread.h"C_Thread::C_Thread(int nMax, QObject *parent) : QThread(parent), m_nMax(nMax)
{}void C_Thread::run()
{int i = 0;while (i < m_nMax) {msleep(100);++i;emit emit_sendValue(i);}
}

当进行start()时,自动调用run(),每过100ms,发送一个数据,主界面进行显示

3.2 继承QObject,之后添加到线程moveToThread(),使用信号和槽方式

需要将进行耗时操作的类,移动到线程中,之后以信号和槽的方式和进度框进行交互
.h

class C_ThreadObject : public QObject
{Q_OBJECT
public:explicit C_ThreadObject(int nMax, QObject *parent = nullptr);signals:void emit_sendValue(int nValue);public slots:void slot_dealValue();private:int     m_nMax;
};

.cpp

C_ThreadObject::C_ThreadObject(int nMax, QObject *parent) : QObject(parent), m_nMax(nMax)
{}void C_ThreadObject::slot_dealValue()
{int i = 0;while (i < m_nMax) {QThread::msleep(100);++i;emit emit_sendValue(i);}
}

3.3 继承QRunnable

重写run(),然后通过线程池调用
.h

class C_ThreadRunnable :public QObject, public QRunnable
{Q_OBJECT
public:explicit C_ThreadRunnable(int nMax);signals:void emit_sendValue(int nValue);public slots:protected:virtual void run() override;private:int m_nMax;
};

.cpp

C_ThreadRunnable::C_ThreadRunnable(int nMax) : m_nMax(nMax)
{}void C_ThreadRunnable::run()
{int i = 0;while (i < m_nMax) {QThread::msleep(100);++i;emit emit_sendValue(i);}
}

3.4 使用QtConcurrent模块

Qt Concurrent模块扩展了Qt Core模块中的基本线程支持,简化了可以在所有可用CPU内核上并行执行的代码开发。
.h

void MainWindow::dealValue()
{int i = 0;while (i < m_nMax) {QThread::msleep(100);++i;emit emit_sendValue(i);}
}

.cpp

QtConcurrent::run(this, &MainWindow::dealValue);

3.5 主线程调用

创建各个线程对象,然后进行模拟耗时操作,进度框显示进度
如果在构造中new过QProgressDialog对象,默认4秒后,会自动显示,可以调用其close()方法,不用显示。
.h

class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();void dealValue();signals:void emit_start();void emit_sendValue(int nValue);private slots:void on_btn_TimeConsumingOperation_clicked();private:Ui::MainWindow *ui;int                   m_nMax;C_DlgProgress*        m_pDlgProgress;C_Thread*             m_pTread;C_ThreadRunnable*     m_pThreadRunnable;C_ThreadObject*       m_pThreadObject;QThread*              m_pThreadUsedObject;
};

.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QThreadPool>
#include <QtConcurrent>
#include <QDebug>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);m_nMax = 20;m_pDlgProgress = new C_DlgProgress(this);m_pDlgProgress->setRange(0, m_nMax);// 1. 继承QThreadm_pTread = new C_Thread(m_nMax, this);connect(m_pTread, &C_Thread::emit_sendValue, this, [=](int nValue){m_pDlgProgress->setValue(nValue);});// 2. 继承QRunnablem_pThreadRunnable = new C_ThreadRunnable(m_nMax);connect(m_pThreadRunnable, &C_ThreadRunnable::emit_sendValue, this, [=](int nValue){m_pDlgProgress->setValue(nValue);});// 3. 继承QObjectm_pThreadObject = new C_ThreadObject(m_nMax);connect(this, &MainWindow::emit_start, m_pThreadObject, &C_ThreadObject::slot_dealValue);connect(m_pThreadObject, &C_ThreadObject::emit_sendValue, this, [=](int nValue){m_pDlgProgress->setValue(nValue);});m_pThreadUsedObject = new QThread(this);m_pThreadObject->moveToThread(m_pThreadUsedObject);m_pThreadUsedObject->start();// 0. 在主线程处理耗时操作connect(this, &MainWindow::emit_sendValue, this, [=](int nValue){m_pDlgProgress->setValue(nValue);});
}MainWindow::~MainWindow()
{if(m_pThreadUsedObject){m_pThreadUsedObject->quit();m_pThreadUsedObject->wait();}delete ui;
}void MainWindow::dealValue()
{int i = 0;while (i < m_nMax) {QThread::msleep(100);++i;emit emit_sendValue(i);}
}void MainWindow::on_btn_TimeConsumingOperation_clicked()
{m_pDlgProgress->show();// 0. 在主线程模拟处理耗时操作,界面卡死//    int i = 0;//    while (i < m_nMax) {//        QThread::msleep(100);//        ++i;//        emit emit_sendValue(i);//    }/*********** 使用哪个,打开哪个注释  ***********/// 1. 继承QThread// m_pTread->start();// 2. 继承QRunnable// QThreadPool::globalInstance()->start(m_pThreadRunnable);// 3. 继承QObject// emit emit_start();// 4. 使用QtConcurrent模块// QtConcurrent::run(this, &MainWindow::dealValue);
}

3.6 结果

主界面显示:
在这里插入图片描述

点击耗时操作
在这里插入图片描述
当进度走完,进度框关闭。

4 完整示例连接

链接: https://download.csdn.net/download/MrHHHHHH/88692241?spm=1001.2014.3001.5501

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/318489.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何制作可预约的上门维修服务小程序?

上门维修服务已经成为人们日常生活中不可或缺的一部分。为了满足这一需求&#xff0c;我们学习如何无经验自己制作上门维修服务小程序。 首先&#xff0c;打开乔拓云-门店系统的后台&#xff0c;可以看到有很多各行各业的模版。这些模版涵盖了各种行业&#xff0c;包括家电维修…

宏晶微 MS9125 USB 投屏控制芯片 VGAHDM输出 全新原装

1.基本介绍 MS9125 是一款 USB 单芯片投屏器,内部集成了 USB2.0 控制器和数据收发模块、视频 DAC、HDMI 接口和音视频处理模块&#xff0c;MS9125 可以通过 USB 接口显示或者扩展 PC、智能手机、平板电脑的显示信息到更大尺寸的显示设备上&#xff0c;支持 VGA 和 HDMI 视频接…

ConcurrentHashMap源码学习

实现接口 ConcurrentMap&#xff08;Map的基础方法&#xff09;、Serializable(序列化) 基础属性 最大容量&#xff1a;2^30 默认容量&#xff1a;16 常用方法 PUT 调用PutVal方法进行插入。 判断key或value是否为空&#xff1a; 是&#xff1a;抛出空指针一场 否&#xff…

CSS 顶部位置翻转动画

<template><div class"container" mouseenter"startAnimation" mouseleave"stopAnimation"><!-- 旋方块 --><div class"box" :class"{ rotate-hor-top: isAnimating }"><!-- 元素内容 --><…

安装tensorrt环境在linux上

在linux上输入命令 bash cat /etc/os-release 命令查看系统版本 nvidia-smi命令后有内容弹出而没有报错,表明系统中安装了NVIDIA显卡驱动&#xff0c;并且该命令成功地显示了有关NVIDIA GPU的信息。 输入nvcc -V并且看到输出时,这表明您的系统中已经安装了NVIDIA的CUDA工具…

38个城市平均薪酬超1万元;丁俊晖6-5绝杀世界第一奥沙利文夺冠;原钉钉副总裁创业杀入AI Agent赛道

投融资 • 原钉钉副总裁创业杀入AI Agent赛道&#xff0c;AI 公司“斑头雁智能科技”获亿元融资• 荣盛石化与沙特阿美拟再相互收购下属公司股权• 斯年智驾完成B轮融资• 欧冶半导体完成A3及A4轮融资• 耀途天使轮项目旗芯微完成数亿元新一轮融资• 野牛王获近千万元天使轮融…

教育机构培训系统小程序功能清单

制作一款适合自己的教育机构培训系统小程序&#xff0c;可以为学员提供更便捷的学习体验&#xff0c;同时提高机构的教学效率。今天将详细介绍如何使用乔拓云平台制作教育机构培训系统小程序。 在浏览器搜索乔拓云&#xff0c;登录到后台&#xff0c;选择教育系统并点击进入。在…

2023年互联网公司年度崩盘报告

B站崩了两次 2023年3月5日晚20:20左右&#xff0c;许多网友表示在使用B站时&#xff0c;手机和电脑端都无法访问视频详情页&#xff0c;且手机端无法查看收藏夹与历史记录。 8月4日晚间&#xff0c;距离上次事故5个月后&#xff0c;又有许多网友反馈B站图片&#xff08;视频封…

8K自动化测试面试题分享(有答案,非常详细)

关于自动化测试面试&#xff0c;会问到哪些问题呢&#xff1f;给大家简单总结了一下&#xff0c;每一个都是学员反馈过来的企业真题&#xff0c;相信对大家有帮助&#xff0c;最近有面试机会的&#xff0c;快来背一下答案吧 1、你会封装自动化测试框架吗&#xff1f; 这个问得…

软件测试基础篇(超详细整理)

1、软件测试的生命周期 回顾&#xff1a;需求分析、计划、设计、编码、测试、运行维护 软件测试的生命周期&#xff1a; 需求分析→测试计划→ 测试设计→ 测试开发→ 测试执行→ 测试评估 需求分析&#xff1a;分析需求的正确性&#xff0c;合理性。细化需求&#xff0c;得…

TB-C/C++

1.main函数之前之后执行的代码 设置栈指针初始化静态变量和全局变量&#xff08;.data段内容&#xff0c;已初始化且不为0&#xff09;赋初值&#xff08;.bss段内容&#xff0c;未初始化的全局变量和静态变量&#xff09;传参&#xff08;argc,argv&#xff09;atexit() 在…

12.Harbor构建私有镜像仓库

1、阿里云容器镜像服务-个人版 细心的同学可能已经发现,在前面的部署过程中,前面所有的部署步骤中需要的镜像都是从阿里云的镜像仓库中下载。 因为网络原因,有的镜像可能下载比较慢,有点可能下载不了,所以为了加速镜像下载,我都统一将镜像推送到阿里云的镜像仓库(个人…