C++11 Qt之QFutureWatcher lambda

Lambda 介绍

Lambda 函数也叫匿名函数, 是C++ 11中新增的特性;谁用谁知道,哈;

  1. Lambda函数的好处

Lambda函数使代码变得更加紧凑、更加结构化和更富有表现力;

lambda在c++作用主要是作为内嵌函数,逻辑更加清楚,代码可读性更好;

【QT】Qt之QFutureWatcher

简述

QFuture 表示异步计算的结果QFutureWatcher 则允许使用信号和槽监视 QFuture,也就是说,QFutureWatcher 是为 QFuture 而生的。

复制代码
// 实例化对象,并连接到 finished() 信号。
MyClass myObject;
QFutureWatcher<int> watcher;
connect(&watcher, SIGNAL(finished()), &myObject, SLOT(handleFinished()));
 
// 开始计算
QFuture<int> future = QtConcurrent::run(...);
watcher.setFuture(future);

使用 lambda

复制代码
     if(nullptr == WidgetWatcher)
    {
        WidgetWatcher = new QFutureWatcher<void>;
        connect(WidgetWatcher, &QFutureWatcher<void>::finished, this, [=]() {

            qDebug()<<"finish threadid "<<QThread::currentThreadId();
             mQProgressDialog->close();
        });
    }

    QFuture<void> future = QtConcurrent::run([=]() {
        //slotShowInsertionWidget();
        qDebug()<<"111 threadid "<<QThread::currentThreadId();
        QThread::sleep(3);
        getTextStaticFun();
    });
    WidgetWatcher->setFuture(future);

传参:

复制代码
// 传入 当前 this
QFuture<void> future = QtConcurrent::run([&]() 

还可以使用 QProgressDialog 作为阻堵 函数,变成同步;

复制代码
  progress->exec();

完成后,关闭;

复制代码
        connect(WidgetWatcher, &QFutureWatcher<void>::finished, this, [=]() {

            qDebug()<<"finish threadid "<<QThread::currentThreadId();
             mQProgressDialog->close();
        });

MyQProgressDialog

复制代码
#ifndef MYPROGRESSDIALOG_H
#define MYPROGRESSDIALOG_H
 
#include<QProgressDialog>
class  MyProgressDialog :public QProgressDialog
{
  Q_OBJECT
public:
    MyProgressDialog(const QString &labelText);
};


#include "myprogressdialog.h"
#include<QProgressBar>
MyProgressDialog::MyProgressDialog(const QString &labelText)
{

     setAutoClose(false);		//进度达到最大值时不关闭,默认为true
    // setLabelText("正在导出数据,请稍后...");	//显示的文本
     setLabelText(labelText);
     setCancelButton(NULL);			//不显示取消按钮
     setWindowModality(Qt::WindowModal);
    //mQProgressDialog->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);
     setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog | Qt::WindowStaysOnTopHint);
     setMinimumWidth(600);
    // setWindowModality(Qt::ApplicationModal);
    //setModal(true);
    QProgressBar * prog = new QProgressBar(this);
    prog->setTextVisible(false);
    //prog->setStyleSheet("QProgressBar{  max-height: 20px;\nbackground: #323232;\nborder-radius: 10px;\ntext-align:center;\n}\nQProgressBar::chunk {  background: #2C6ED5;\nborder-radius: 10px;\n}");
    prog->setRange(0, 0);
     setBar(prog);
    //mQProgressDialog->hide();
     reset();
}
相关推荐
星火开发设计1 小时前
枚举类 enum class:强类型枚举的优势
linux·开发语言·c++·学习·算法·知识
qq_192779877 小时前
C++模块化编程指南
开发语言·c++·算法
代码村新手7 小时前
C++-String
开发语言·c++
qq_401700418 小时前
Qt 中文乱码的根源:QString::fromLocal8Bit 和 fromUtf8 区别在哪?
开发语言·qt
历程里程碑9 小时前
滑动窗口---- 无重复字符的最长子串
java·数据结构·c++·python·算法·leetcode·django
2501_9403152610 小时前
航电oj:首字母变大写
开发语言·c++·算法
lhxcc_fly10 小时前
手撕简易版的智能指针
c++·智能指针实现
浒畔居11 小时前
泛型编程与STL设计思想
开发语言·c++·算法
Fcy64811 小时前
C++ 异常详解
开发语言·c++·异常
机器视觉知识推荐、就业指导11 小时前
Qt 和 C++,是不是应该叫 Q++ 了?
开发语言·c++·qt