Qt5 的connect新语法中 lambda表达式的引用传递问题

介绍 Qt5 的 connect 新式语法的文章很多,关于其使用 lambda 表达式的语法也很容易搜到,今天我来一点不一样的干货也可以说是bug,由于个人能力原因,无法深究真正的原因,望神通广大的网友能告知一下,不尽感激。

/*
 * 使用Qt 5.15.0 创建一个新的GUI程序,基类选择QWidget
 * 同时取消创建 ui界面,在 widget.cpp 中写上下面的代码
 * 然后编译执行,在弹出的窗口中,点击QPushButton即可验证
*/
#include "widget.h"
#include <stdio.h>
#include <QDebug>
#include <QLabel>
#include <QPushButton>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
          
   
    resize(500, 300);
    QLabel *label = new QLabel("Label", this);
    label->resize(100, 50);
    QPushButton *pushButton = new QPushButton("PushButton", this);
    qDebug() << "1	" << label;
    qDebug() << "2	" << (void *)label;
    connect(pushButton,
            &QPushButton::clicked,
            [&label] () {
          
   qDebug() << "3	" << (void *)label;});
}

Widget::~Widget()
{
          
   
}

/*
 * 结果如下:
 * 1        QLabel(0x1eeffe64b40)
 * 2        0x1eeffe64b40
 * 3        0x32773cfa48

 * 经实测 label 使用引用传递时,打印其值时,发现lambda中的label和lambda外的label结果不一样
 * 另外,在lambda中打印label时,需要强转为(void *)类型
 * “qDebug() << label;”会造成段错误。原因即是本次实验的表明的结果。
*/
经验分享 程序员 微信小程序 职场和发展