直接调用事件处理程序

时间:2016-05-03 03:54:12

标签: c++ events methods wxwidgets

无法直接从我的代码调用事件处理程序。我在2年前在这里发现了同样的问题。 original question

但行 me_InsertCommentText(wxCommandEvent()); 没有编译(mingw32-gcc 4.8,win7,codeblocks,wxFormBuilder)

  

错误:没有匹配函数来调用'mjpgen_wdDialog :: me_InsertCommentText(wxCommandEvent)'   注意:候选人是:   注意:void mjpgen_wdDialog :: me_InsertCommentText(wxCommandEvent&)

对我来说,似乎是由引用参数调用引起的。 我怎样才能让它发挥作用?

2 个答案:

答案 0 :(得分:2)

关于使用命名临时变量的答案在技术上是正确的,但重要的是你真的不应该首先这样做。处理程序只能从wxWidgets中调用,而不是直接调用某些OnFoo(wxFooEvent&),而是应该重构代码,只需从DoFoo()调用一些新的OnFoo(),然后调用DoFoo()如果需要,可以从代码的其余部分开始。

使用C ++ 11时,这变得更加简单,因为在这种情况下你甚至根本不需要OnFoo()而只能写

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

避免额外的功能。

答案 1 :(得分:1)

wxCommandEvent()是一个临时对象,不能绑定到非const引用。你可以在这里使用命名变量:

wxCommandEvent event;
me_InsertCommentText(event);

或将参数类型更改为const reference:

void mjpgen_wdDialog::me_InsertCommentText(const wxCommandEvent&)

然后

me_InsertCommentText(wxCommandEvent());