初学Qt5.9.2中textChanged信号,用lambda进行捕获的时候出现意外

代码如下会宕

#ifndef MYWIDGET_H
#define MYWIDGET_H
#include "stdaxf.h"

class myWidget : public QWidget
{
    Q_OBJECT
public:
    explicit myWidget(QWidget *parent = nullptr);


signals:

public slots:
    void slotcurrentIndexChanged(const QString &);
};

#endif // MYWIDGET_H

#include "myWidget.h"

myWidget::myWidget(QWidget *parent) : QWidget(parent)
{
    QBoxLayout *lay = new QVBoxLayout(this);
    QTextEdit *texte,*_edit;
        /*如果将QTextEdit *_edit;独立写到.h文件中,不和lambda表达式一起
        ,则可以正常运行*/

    lay->addWidget(texte = new QTextEdit);
    _edit = texte;
        /*出现奇怪问题的地方:为什么不能用texte来打印,而必须缓存一个变量才能正常使用,同时这个缓存变量的定义不能和这段lambda表达式,书写的文件是同一个?*/
    connect(texte,&QTextEdit::textChanged,[&](){
       qDebug()<<_edit->toPlainText();
    });
}

void myWidget::slotcurrentIndexChanged(const QString &str)
{
    qDebug()<<"currentIndexChanged:  "<<str;
}
int main(int argc,char**argv)
{
    QApplication app(argc,argv);
    myWidget widget;
    widget.show();
    return app.exec();
}

2个回答

有可能是_edit作用域的问题,你把它写成全局作用域的变量应该也可以。可能是离开作用域后,当信号触发的时候,_edit这个指针变量已经随栈被回收,无法访问

有可能是_edit作用域的问题,你把它写成全局作用域的变量应该也可以。可能是离开作用域后,当信号触发的时候,_edit这个指针变量已经随栈被回收,无法访问

SUMNUSSARONG
SUMNUSSARONG 复制 粘贴水贴 过分了吧
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!