首页 > 其他分享 >Qt小技巧16.信号与lambda的一点小记

Qt小技巧16.信号与lambda的一点小记

时间:2022-09-29 18:23:47浏览次数:45  
标签:Qt 16 MyThread 线程 include MainWindow 表达式 lambda

1 引言

Qt中用信号连接到一个lambda表达式,可谓十分清爽,简单易懂,但是你觉得你真的就完全会用了?有些坑还是要去踩的。

2 看个例子

这里定义一个QThread子类MyThread,在MainWindow槽函数中启动这个线程,同时将MyThread中的信号连接到一个lambda表达式,例子很简单,代码如下:

2.1 MyThread

#include "MyThread.h"
#include <QDebug>
MyThread::MyThread(QObject *parent) : QThread(parent)
{
}

void MyThread::run()
{
    qDebug() << __FUNCTION__ << QThread::currentThread();
    emit checkDone();
}

2.2 MainWindow

#include "ui_MainWindow.h"
#include "MyThread.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    qDebug() << "mainwindow" << QThread::currentThread();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    MyThread *thread = new MyThread(this);
    connect(thread, &MyThread::checkDone, this,  [=] {
            qDebug() << __FUNCTION__ << QThread::currentThread();
    });
    thread->start();
}

2.3 看看打印结果


此时,lambda表达式中的代码在主线程中执行,这个没啥毛病。
现在我们把代码修改下,把connect中的this去掉:

void MainWindow::on_pushButton_clicked()
{
    MyThread *thread = new MyThread(this);
    connect(thread, &MyThread::checkDone, [=] {
            qDebug() << __FUNCTION__ << QThread::currentThread();
    });
    thread->start();
}

再来看看打印结果:

是不是有点惊喜,此时,lambda表达式中的代码没在主线程中执行了,和MyThread::run在一个线程。

2.4 简单分析下

我们先来看看connect函数的原型:

这个就是加了this和没加this的区别,两个函数的原型是不同的。
需要注意的是,加了this这个函数原型参数是const QObject *context,指的是上下文,含义上和const QObject *receiver是不一样的,这点务必要理解。
这样就好懂了,加了this,默认就是自动连接方式,所以lambda表达式中的代码会在主线程中执行,如果没加this,那么lambda表达式中的代码会在发出信号的那个线程中执行,这就是区别。

3 总结

虽然lambda表达式很方便、也很强大,但是很多人在使用的过程中,由于不清楚里面的原理,经常会遇到程序异常现象,比如在子线程中操作了界面,稀里糊涂的就进行了跨线程操作,殊不知这个看似平常的操作隐藏着巨大隐患。如果程序中大量用到lambda表达式,排查错误自然也会变得更加麻烦,好啦,就说这么多,有不对的地方欢迎大家批评指正。

标签:Qt,16,MyThread,线程,include,MainWindow,表达式,lambda
From: https://www.cnblogs.com/luoxiang/p/16742396.html

相关文章

  • Microsoft PowerPoint LTSC 2021 for Mac(ppt演示工具)v16.67 beta版 mac/win
    PowerPoint2021forMac是一款能够在mac平台上使用的ppt演示工具,随时随地快速轻松地创建、编辑、查看、演示或共享演示文稿。需要随时随地快速访问最近使用的PowerPoint......
  • 16. HTML-- 布局(附带示例)
    1.前言网页布局是创建一个网站时一个必不可少的过程,通过布局可以改变网页中内容的排列方式,让网页看起来更加合理、美观。在布局的过程中您还可以使用CSS来修改HTML标......
  • VMware16的安装及VMware配置Linux虚拟机(详解版)
    何故Mhttps://blog.csdn.net/m0_50519965/article/details/116175873?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166443741016782388011505%2522%252C%25......
  • qt 开发
    1、报错1>------已启动生成:项目:tableTest,配置:DebugWin32------1> main.cpp1>main.obj:errorLNK2019:无法解析的外部符号"int__cdeclqInitResources_......
  • leetcode169-多数元素
    169.多数元素这道题虽然是简单题,但是有很多精妙的解法。详情看官方题解classSolution{public:intmajorityElement(vector<int>&nums){intsize=n......
  • pyqt之配置工具
    刚开始,我一边看的绿皮书,经典的入门到实践,哈哈,一边抠出来的GUI,其实就是简单的对json文件中静态数据进行常规的crud,只不过是在可视化界面去操作。那本书,我大概就看......
  • Qt 之 事件的 类型大全
    enumQEvent::TypeThisenumtypedefinesthevalideventtypesinQt.Theeventtypesandthespecializedclassesforeachtypeareasfollows:此枚举类型定义......
  • Qt小技巧15.Pro文件的床边故事
    1引言这篇文章很简单,小结下Pro文件的那些好用但是又不常用的功能,用好了Pro文件,对开发人员来说那是大有裨益,身体倍儿棒。2说正事2.1定义一个字符串宏例如我想定义一......
  • 题解【CF1632E1 Distance Tree (easy version)】
    CF1632E1DistanceTree(easyversion&hardversion)解题报告。不一定更好的阅读体验。E2没有地方交了所以就交到E1了。震撼挺大的一道题,钦定\(1\)为根。先......
  • QT——vs 中配置qt动态库,无法解析外部命令,解决办法
    vs+qt动态库无法解析外部符号的问题原文链接https://itcn.blog/p/0541664353.html 1、问题描述:无法解析的外部符号解决方案:引用的库没有引用进来,结局方案如下:(1......