【问题标题】:Calling event handler directly直接调用事件处理程序
【发布时间】:2016-08-27 23:29:05
【问题描述】:

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

但是这条线 me_InsertCommentText(wxCommandEvent()); 未编译(mingw32-gcc 4.8、win7、codeblocks、wxFormBuilder)

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

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

【问题讨论】:

    标签: c++ events methods wxwidgets


    【解决方案1】:

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

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

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

    避免额外的功能。

    【讨论】:

    • 当然,这是一种整洁的方式,但需要在需要直接调用时立即重新处理每个事件处理程序。
    • 我对绑定模板不熟悉。不确定这将如何与 wxFormBuilder 生成的事件处理程序代码一起使用。它为事件处理程序生成一个虚拟方法。
    • 事件处理程序是否是虚拟的并不重要,我不确定您为什么认为它是虚拟的?
    【解决方案2】:

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

    wxCommandEvent event;
    me_InsertCommentText(event);
    

    或将参数类型改为const引用:

    void mjpgen_wdDialog::me_InsertCommentText(const wxCommandEvent&)
    

    然后

    me_InsertCommentText(wxCommandEvent());
    

    【讨论】:

    • 我想过这个,但在我看来这不是很干净的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多