#c #events #wxwidgets
#c #Мероприятия #wxwidgets
Вопрос:
Как вызвать функцию, к которой уже прикреплено событие?
Я хочу иметь возможность вызывать функцию с чем-то вроде этого:
statsDialog::statsDialog(..) : wxDialog(..) {
updateStats();
}
Или, как привязать несколько обработчиков событий к функции? Например, вызовите updateStats с wxEVT_SET_FOCUS
событием И при UPDATE_STATS_BUTTON
нажатии. Как я могу сделать это без дублирования кода (скопировав функцию updateStats, просто изменив ее на wxFocusEventHandler
)?
BEGIN_EVENT_TABLE(statsDialog, wxDialog)
EVT_BUTTON(UPDATE_STATS_BUTTON, statsDialog::updateStats)
END_EVENT_TABLE()
statsDialog::statsDialog(..) : wxDialog(..) {
// layout stuff
}
void
statsDialog::updateStats(wxCommandEventamp; event) {
// do stuff on dialog focus AND when UPDATE_STATS_BUTTON is pressed
}
Ответ №1:
Просто вызовите функцию, вызываемую DoUpdateStats()
как из обработчиков событий focus, так и из обработчиков событий button. Это особенно тривиально при использовании C 11 с Bind()
:
Bind(wxEVT_SET_FOCUS, [](wxFocusEventamp; e) { e.Skip(); DoUpdateStats(); });
btn->Bind(wxEVT_BUTTON, [](wxCommandEventamp;) { DoUpdateStats(); });
Комментарии:
1. Спасибо! Работает, но для компиляции пришлось добавить amp; в скобках.
updateStatsButton->Bind(wxEVT_BUTTON, [amp;](wxCommandEventamp;) { DoUpdateStats(); });
2. Узел захвата по умолчанию не нужен, если
DoUpdateStats()
это глобальная функция, но если это метод-член, вам нужно захватитьthis
. Однако, возможно, лучше сделать это явно, чем использовать режим захвата по умолчанию.