首页 > 解决方案 > 在qt c ++ lambda Signal&Slots中通过引用传递类的实例不起作用

问题描述

Profile3.cpp 中的这段代码我只想传递 Kitchen_Data 类引用的实例 kitchenData,而不是按值传递,但它会打印

错误:未定义对“Profile3::Kitchen_DoubleClicked(Kitchen_Data&)”的引用

Profile3::Profile3(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Profile3)
{
  ui->setupUi(this);

  Kitchen_Data  kitchenData;

  connect(ui->treeWidget_Kitchen,
        &QTreeWidget::itemDoubleClicked,
        [&,this]{Kitchen_DoubleClicked (kitchenData);});
}

在 profile3.h 我有课

class Kitchen_Data{

public:

    QString MealCode;
    QString MealName;
    QString MealPrice;
    QString MealType;
    QTreeWidgetItem * itemm_CancelButton_From_Kitchen ;
    QVector <QString> KitechenItemPrice;
    QVector <QString> KitechenItemName;

    QString All_Added_ItemOfKitechen;
    QString KitchenTotalPrice;
};

profile3 类的这个私有插槽和我想使用的函数将实例传递给

private slots:


void  Kitchen_DoubleClicked(Kitchen_Data &Kitchen);

标签: c++qtlambda

解决方案


正如评论中提到的,在 lambda 中传递对局部变量的引用是一个坏主意。当您从插槽内访问该实例时,该实例kitchenData已经超出范围/被销毁。Kitchen_DoubleClicked为了使它能够存活足够长的时间以供插槽使用,您需要动态分配它(例如Kitchen_Data* kitchenData = new Kitchen_Data;),或者创建类kitchenData的成员Profile3,例如:

class Profile3 {
    Kitchen_Data kitchenData;
    // other members, methods, slots, etc...
};

推荐阅读