Qt: Издает ли сигналы в lamdas нормально или это плохой стиль (и это вызовет проблемы) - PullRequest
3 голосов
/ 03 мая 2019

Допустим, у меня есть виджет, содержащий Button и Spinbox.Когда нажата кнопка, я хочу передать значение Spinbox.

Я вижу два возможных способа сделать это:
Либо я могу создать функцию закрытого члена

//...
connect(m_Button, &QPushButton::clicked, this, &SomeWidget::emitSpinboxValue);
//...

SomeWidget::emitSpinboxValue() {
    emit spinboxValueChanged(m_Spinbox->value());
}

Или я могу сделать это прямо в лямбде:

//...
connect(m_Button, &QPushButton::clicked, [this]() { emit spinboxValueChanged(m_Spinbox->value()) });
//...

Лямбда-путь выглядит более аккуратно (поскольку мне не нужно создавать довольно пустую функцию-член), но с другой стороны, видя, что emit влямбда вызывает у меня неприятные ощущения в кишечнике.

Итак, излучает ли сигналы лямбда-сигнал нормально (и моя кишка сверхчувствительна), или это плохой стиль (или я даже настраиваю себя на неожиданные неприятности?)в будущем)

Ответы [ 2 ]

3 голосов
/ 03 мая 2019

Все нормально

emit - пустой макрос.Сигнал - это функция (сгенерированная инструментом), и он вызывается так же, как и любая другая функция.Вы захватили this, поэтому вы можете вызывать любого члена из лямбды, как если бы вы использовали метод SomeWidget.

1 голос
/ 03 мая 2019

Это совершенно нормально. Однако в вашем коде что-то не так:

connect(m_Button, &QPushButton::clicked, [this]() { emit spinboxValueChanged(m_Spinbox->value()) });

Должно быть:

//                                    Important!
//                                       vvvv
connect(m_Button, &QPushButton::clicked, this, [this]() { 
    emit spinboxValueChanged(m_Spinbox->value()); 
});

Вы должны указать контекст объекта для функтора, чтобы гарантировать, что функтор не будет вызван, если объект больше не существует.

См. сообщение для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...