【问题标题】:How to set multiple events on function如何在函数上设置多个事件
【发布时间】:2017-03-01 02:21:30
【问题描述】:

如何调用已经附加了事件的函数?

我希望能够像这样调用函数:

statsDialog::statsDialog(..) : wxDialog(..) {
    updateStats();
}

或者,如何将多个事件处理程序绑定到一个函数?例如,使用 wxEVT_SET_FOCUS 事件和按下 UPDATE_STATS_BUTTON 时调用 updateStats。如何在不复制代码的情况下做到这一点(复制 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(wxCommandEvent& event) {
    // do stuff on dialog focus AND when UPDATE_STATS_BUTTON is pressed
}

【问题讨论】:

    标签: c++ events wxwidgets


    【解决方案1】:

    只需从焦点和按钮事件处理程序调用一个名为DoUpdateStats() 的函数。当使用 C++11 和 Bind() 时,这尤其微不足道:

    Bind(wxEVT_SET_FOCUS, [](wxFocusEvent& e) { e.Skip(); DoUpdateStats(); });
    btn->Bind(wxEVT_BUTTON, [](wxCommandEvent&) { DoUpdateStats(); });
    

    【讨论】:

    • 谢谢!有效,但必须在括号中添加 & 才能编译。 updateStatsButton->Bind(wxEVT_BUTTON, [&](wxCommandEvent&) { DoUpdateStats(); });
    • 如果DoUpdateStats()是全局函数,则不需要默认捕获节点,但如果是成员方法,则需要捕获this。但是,明确地执行此操作可能比使用默认捕获模式更好。
    猜你喜欢
    • 2022-08-22
    • 2022-11-28
    • 2022-08-19
    • 2015-05-26
    • 2015-10-07
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 2014-05-22
    相关资源
    最近更新 更多