Russian Qt Forum
Май 02, 2024, 05:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Лямбда-слоты ведут себя странно (Решено)  (Прочитано 2718 раз)
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« : Декабрь 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, что вполне ожидаемо. Чтобы это значило? Лямбда слоты коннектятся как-то по особенному?
« Последнее редактирование: Декабрь 08, 2015, 15:51 от xokc » Записан
Fat-Zer
Гость
« Ответ #1 : Декабрь 07, 2015, 23:28 »

Не лямбда-слоты коннектятся по-особому, а все функции-слоты такие... в данном случае DBModel не имеет к соединению ни какого отношения...
Надо задать контекст (использовать другой вызов connect() ):
Код:
connect(chModel, &ChannelsModel::channelDeleted, this, [=](int index) {
        qDebug() << "deleted" << index;
    });
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #2 : Декабрь 08, 2015, 15:50 »

Ну конечно, this то пропустил! Спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.09 секунд. Запросов: 23.