2016-05-03 5 views
2

У вас возникли проблемы с вызовом обработчика событий непосредственно из моего кода. Я нашел тот же вопрос 2 года назад здесь. original questionВызов обработчика событий напрямую

Но линия me_InsertCommentText(wxCommandEvent()); не компиляции (mingw32-GCC 4.8, win7, CodeBlocks, wxFormBuilder)

error: no matching function for call to 'mjpgen_wdDialog::me_InsertCommentText(wxCommandEvent)' note: candidate is: note: void mjpgen_wdDialog::me_InsertCommentText(wxCommandEvent&)

Для меня, что, как представляется, быть вызвано вызовом справочными параметрами. Как я могу заставить это работать?

ответ

2

Ответ об использовании временной переменной с именем технически правильно , но важно то, что вы действительно не должны делать это в первую очередь. Обработчики должны только вызываться из wxWidgets и вместо того, чтобы называть некоторые OnFoo(wxFooEvent&), вы должны реорганизовать свой код, чтобы просто вызвать некоторые новые DoFoo() от OnFoo(), а затем позвонить по номеру DoFoo() из остальной части вашего кода, если вам это нужно.

Это становится еще проще при использовании C++ 11, как вы даже не нужно иметь OnFoo() вообще в этом случае и может просто написать

whatever->Bind(wxEVT_FOO, [=](wxCommandEvent&) { DoFoo(); }); 

, чтобы избежать дополнительной функции.

+0

Уверенный, что это аккуратный способ, но потребуется переработать каждый обработчик событий, как только он должен быть вызван напрямую. – ahagele

+0

Я не знаком с шаблоном связывания. Не знаете, как это будет работать с кодом обработчика событий, созданным wxFormBuilder. Он генерирует виртуальный метод для обработчика событий. – ahagele

+0

Не имеет значения, является ли обработчик событий виртуальным или нет, и я не совсем уверен, почему вы думаете, что он делает? –

2

wxCommandEvent() - временный объект, который не может быть связан с неконстантной ссылкой. Можно использовать с именем переменной здесь:

wxCommandEvent event; 
me_InsertCommentText(event); 

или изменить тип параметра константной ссылке:

void mjpgen_wdDialog::me_InsertCommentText(const wxCommandEvent&) 

затем

me_InsertCommentText(wxCommandEvent()); 
+0

Я думал об этом, но это не очень чистый подход в моем сознании. – ahagele

Смежные вопросы