无法将 EVT_COMMAND 从一个 class 发送到另一个

Unable to send EVT_COMMAND from one class to another

我刚开始使用 wxWidgets,但 运行 遇到了问题。

我有一个 mainwindow 和另一个从 wxDialog 派生的 class。 main window 以非模态模式启动对话框。当对话框关闭时,它 post 是一个事件,但永远不会调用此事件的处理程序。

我正在使用 wxWidgets 3.1.5

以上两个class共享一个头文件,我在里面有这段代码

wxDECLARE_EVENT(EVT_VISOR, wxCommandEvent);

这是我的活动table

BEGIN_EVENT_TABLE(VisorFrame, wxFrame)
....
    EVT_COMMAND(ID_DlgDisplayLogsTerminated, EVT_VISOR, VisorFrame::OnDlgDisplayLogsTerinated)
....
END_EVENT_TABLE()

在派生自 wxDialog 的 class 中,我在文件顶部有这个

wxDEFINE_EVENT(EVT_VISOR, wxCommandEvent);

这是我的事件处理器

void
VisorFrame::OnDlgDisplayLogsTerinated(wxCommandEvent& event)
{
    wxPuts(_("VisorFrame::OnDlgDisplayLogsTerinated ent"));
}

最后,这就是我 post 我的活动

void
DlgDisplayLogs::OnClose(wxCloseEvent& ev)
{
    wxPuts(_("send event"));
    wxCommandEvent event(EVT_VISOR, ID_DlgDisplayLogsTerminated); // enum value
    event.SetEventObject(this);
    event.SetString("Hello");
    QueueEvent(event.Clone());

    ev.Skip();
}

我已按照文档进行操作,但我一定是做错了什么!

我想你快到了。我认为您可以做的是将 wxFrame 作为父项传递给您的无模式对话框,并通过父项 post 传递事件。

wxCommandEvent event(EVT_VISOR, ID_DlgDisplayLogsTerminated); 
event.SetEventObject(this);
event.SetString("Hello");
wxPostEvent(frameParentPtr, event);

在你的 wxFrame 活动中 table:

EVT_COMMAND(wxID_ANY, EVT_VISOR, VisorFrame::OnDlgDisplayLogsTerinated)