Russian Qt Forum

Qt => Общие вопросы => Тема начата: xokc от Декабрь 07, 2015, 22:46



Название: Лямбда-слоты ведут себя странно (Решено)
Отправлено: xokc от Декабрь 07, 2015, 22:46
Имею GUI приложение со следующим кодом:

Код
C++ (Qt)
DBModel::DBModel(QObject *parent) : QSqlQueryModel(parent)
{
   connect(chModel, &ChannelsModel::channelDeleted, [=](int index) {
       qDebug() << "deleted" << index;
   });
}
 
DBModel::~DBModel()
{
   qDebug() << "~DBModel";
}

При завершении программы сначала отрабатывает деструктор DBModel, потом в процессе отработки других деструкторов срабатывает сигнал ChannelsModel::channelDeleted. Ожидаемое поведение  - слот не должен вызваться, так как DBModel к этому моменту уже убито. Однако, в консоли получаю...
~DBModel
deleted 0
и закономерный креш по факту обращения с убитым уже this.
При этом, если меняю лямбда слот на "обычный":
Код
C++ (Qt)
connect(chModel, &ChannelsModel::channelDeleted, this, &DBModel::delch);
то всё в порядке, в консоли только ~DBModel, что вполне ожидаемо. Чтобы это значило? Лямбда слоты коннектятся как-то по особенному?


Название: Re: Лямбда-слоты ведут себя странно
Отправлено: Fat-Zer от Декабрь 07, 2015, 23:28
Не лямбда-слоты коннектятся по-особому, а все функции-слоты такие... в данном случае DBModel не имеет к соединению ни какого отношения...
Надо задать контекст (использовать другой вызов connect() ):
Код:
connect(chModel, &ChannelsModel::channelDeleted, this, [=](int index) {
        qDebug() << "deleted" << index;
    });


Название: Re: Лямбда-слоты ведут себя странно (Решено)
Отправлено: xokc от Декабрь 08, 2015, 15:50
Ну конечно, this то пропустил! Спасибо.