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

发布于 2025-01-13 05:57:57 字数 1064 浏览 1 评论 0原文

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

我有一个主窗口和另一个从 wxDialog 派生的类。主窗口以非模式模式启动对话框。当对话框关闭时,它会发布一个事件,但该事件的处理程序永远不会被调用。

我正在使用 wxWidgets 3.1.5

上面的两个类共享一个公共头文件,其中我有这样的代码

wxDECLARE_EVENT(EVT_VISOR, wxCommandEvent);

这是我的事件表

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

在从 wxDialog 派生的类中,我的文件顶部有这个

wxDEFINE_EVENT(EVT_VISOR, wxCommandEvent);

这是我的事件处理程序

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

最后,这是我如何发布我的活动

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();
}

我已遵循文档,但我一定做错了什么!

I'm just starting with wxWidgets and I've run into a problem.

I have a mainwindow and another class derived from wxDialog. The main window launches the dialog box in non-modal mode. When the dialog closes, it posts an event but the handler for this event never gets called.

I'm using wxWidgets 3.1.5

The above two classes share a common header file, in which I have this code

wxDECLARE_EVENT(EVT_VISOR, wxCommandEvent);

This is my event table

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

In the class derived from wxDialog, I have this at the top of my file

wxDEFINE_EVENT(EVT_VISOR, wxCommandEvent);

This is my event handler

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

And finally, this is how I post my event

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();
}

I have followed the documentation but I must be doing something wrong!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我做我的改变 2025-01-20 05:57:57

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

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

在您的 wxFrame 事件表中:

EVT_COMMAND(wxID_ANY, EVT_VISOR, VisorFrame::OnDlgDisplayLogsTerinated)

I think you're nearly there. I think what you could do is pass the wxFrame as a parent to your modeless dialog and post the event via the parent.

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

And in your wxFrame event table:

EVT_COMMAND(wxID_ANY, EVT_VISOR, VisorFrame::OnDlgDisplayLogsTerinated)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文