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.mzph.cn/news/593940.shtml

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

相关文章

Document对象详解

前言 在前端开发中&#xff0c;DOM&#xff08;文档对象模型&#xff09;扮演着重要的角色。它允许我们使用JavaScript来与网页文档进行交互&#xff0c;实现动态的网页效果。DOM的核心部分之一就是Document对象&#xff0c;它代表了整个HTML文档。在本篇博客中&#xff0c;我们…

华媒舍:6个使你的媒体发稿推广更简单的方法!

做为新闻报道媒体从业人员&#xff0c;在宣传发稿上要行走在最前沿&#xff0c;保持竞争力。下面我们就向您介绍六个又简单又实用的方法&#xff0c;帮助你提升新闻报道媒体营销推广发稿效果。 方法一&#xff1a;明确目标群体我们应该明确定义我们自己的目标群体。掌握观众的特…

小H靶场笔记:DC-3

DC-3 January 3, 2024 4:11 PM Tags&#xff1a;Joomla owner&#xff1a;只惠摸鱼 信息收集 探测靶机ip&#xff1a; 192.168.199.133 nmap 扫描端口、 系统版本 漏洞 发现只有80端口开发&#xff0c; 且有cve-2017-8917漏洞存在是Joomla的SQL注入漏洞 Joomla版本为3.7.0…

相关性与P值

相关性与P值 0 FQA&#xff1a;1 相关性与显著性的关系2 相关性分析3 使用medcalc进行相关性分析&#xff1a;参考文章&#xff1a; 0 FQA&#xff1a; 主要描述相关性和p值分别代表什么意义&#xff1f; 以及如何使用medcalc计算相关性和p值。 Q1&#xff1a;p值代表什么意义…

【每日一题】466. 统计重复个数-2024.1.2

题目&#xff1a; 466. 统计重复个数 定义 str [s, n] 表示 str 由 n 个字符串 s 连接构成。 例如&#xff0c;str ["abc", 3] "abcabcabc" 。 如果可以从 s2 中删除某些字符使其变为 s1&#xff0c;则称字符串 s1 可以从字符串 s2 获得。 例如&…

主流桌面浏览器Chrome,FireFox和Edge等如何禁用弹出式窗口阻止程序,这里有详细步骤

为什么你想知道如何禁用浏览器中的弹出式窗口阻止程序?毕竟,弹出式窗口是网络的祸害:显示烦人的广告、虚假的安全消息和其他刺激,会分散你的浏览注意力,甚至可能包含恶意代码。 所有主要的桌面浏览器现在都默认阻止弹出式窗口,那么你到底为什么要取消阻止这些害虫呢?事…

【力扣100】39.组合总和

添加链接描述 class Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:def backtrack(path,target,res,index):if target0:res.append(path[:])returnif target<0:return for i in range(index,len(candidates)):if target&g…

c盘扩容时,d盘无法删除卷问题

C盘扩容时&#xff0c;磁盘管理中D盘右键无法删除卷的原因 首先&#xff0c;D盘下文件夹为空&#xff0c;但是显示可用空间不是100%&#xff0c;经过排查&#xff0c;发现是虚拟内存设置在了D盘导致无法删除卷&#xff0c;这里只需要将虚拟内存放到其他盘&#xff0c;如E盘即可…

【MyBatis】配置 SQL 提示(IDEA 代码自动补全)和解决未能解析数据库 Unable to resolve table ‘employee‘ 问题

默认在 MyBatis 中编写 SQL 语句是不识别的。 需要做如下配置&#xff1a; 然后 SQL 语句可以出现提示&#xff0c;但是自己的数据库会报错&#xff1a; 原因是 IDEA 没有和 数据库 建立连接&#xff0c;需要连接数据库&#xff08;注意&#xff1a;需要具体到某个 Schema&…

springCloud之Stream

1、简介 Spring Cloud Stream是一个用来为微服务应用构建 消息驱动 能力的框架。通过使用 Spring Cloud Strea m &#xff0c;可以有效简化开发人员对消息中间件的使用复杂度&#xff0c;降低代码与消息中间件间的耦合度&#xff0c;屏蔽消息中间件 之 间的差异性&#xff0c;…

stm32学习总结:5、Proteus8+STM32CubeMX+MDK仿真串口并使用串口打印日志(注意重定向printf到串口打印的问题)

stm32学习总结&#xff1a;5、Proteus8STM32CubeMXMDK仿真串口并使用串口打印日志&#xff08;注意重定向printf到串口打印的问题&#xff09; 文章目录 stm32学习总结&#xff1a;5、Proteus8STM32CubeMXMDK仿真串口并使用串口打印日志&#xff08;注意重定向printf到串口打印…

软碟通UltraISO制作U盘安装Ubuntu

清华大学开源软件镜像站https://mirrors.tuna.tsinghua.edu.cn/ 从里面下载ubuntu-22.04-desktop-amd64.iso UltraISO是一款非常不错的U盘启动盘制作工具&#xff0c;一直被许多网友们所喜欢&#xff0c;使用简单、方便。 UltraISO官方下载地址&#xff1a;https://cn.ultrais…

魔改版小市值策略

策略思路 最近几年&#xff0c;小市值策略一直都收益不错&#xff08;当然&#xff0c;不包含17年和18年&#xff09;。小市值因子对收益的影响是很大的。特别是行情不好的时候&#xff0c;大家都忙着炒作热点&#xff0c;那么这时候符合题材的小市值更加符合炒作标准了。 为…

安装tensorrt环境在linux上

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

MySQL第三战:CRUD,函数1以及unionunion all

前言 在当今的数字化时代&#xff0c;数据库已经成为信息管理的重要工具。其中&#xff0c;MySQL作为一种流行的关系型数据库管理系统&#xff0c;已经广泛应用于各种业务场景。在本文中&#xff0c;我们将深入探讨MySQL中的核心概念&#xff0c;包括创建&#xff08;Create&a…

[每周一更]-(第51期):Go的调度器GMP

参考文献 https://learnku.com/articles/41728http://go.cyub.vip/gmp/gmp-model.html#g-m-phttps://blog.csdn.net/ByteDanceTech/article/details/129292683https://www.ququ123.top/2022/04/golang_gmp_principle/ 什么是GMP? GMP模型是Go语言并发模型的核心概念&#x…

ASP.NET Core基础之图片文件(一)-WebApi访问静态图片

阅读本文你的收获&#xff1a; 学会在WebApi项目中访问静态图片了解静态文件中间件UseStaticFiles的用法 系统中免不了要去处理图片文件&#xff0c;比如上传商品的图片、显示商品的图片&#xff0c;访问系统中的图片等等&#xff0c;根据微软官网描述&#xff1a; 静态文件&a…

自动化测试框架 —— pytest框架入门到入职篇

01、pytest框架介绍 pytest 是 python 的第三方单元测试框架&#xff0c;比自带 unittest 更简洁和高效&#xff0c;支持非常丰富的插件&#xff0c;同时兼容 unittest 框架。这就使得我们在 unittest 框架迁移到 pytest 框架的时候不需要重写代码。 pytest框架优点 1、简单…

Ubuntu Server 22.04 连接Wifi并配置静态IP

Ubuntu Server 22.04 连接Wifi并配置静态IP 前言&#xff1a;我家最近好几台电脑&#xff0c;我都想跑着Ubuntu Server做服务器&#xff0c;但是近几年的超级本已经不自带网口了&#xff0c;所以我就考虑用Wifi来联网&#xff0c;速度也还可以&#xff0c;但是既然是跑服务&…

Nginx 中的日志

目录 1.定制访问日志记录格式 1.1 全部日志记录 1.2 每个网站独属一份日志 2.日志路径 3.错误日志 1.定制访问日志记录格式 1.1 全部日志记录 该配置处于nginx.conf 文件中 log_format compression $remote_addr - $remote_user [$time_local] "$request" $sta…