【问题标题】:wxWidgets Event-Propagation from Dialogs in C++wxWidgets 事件-从 C++ 中的对话框传播
【发布时间】:2013-11-16 15:21:06
【问题描述】:

我对使用 wxWidgets 进行 GUI 编程比较陌生。最近,我感到沮丧的是,对话框上下文中事件传播的默认行为是不会自动将事件传播回父级。文档说“可能有太多对话框事件需要跟踪”。我正在为事件使用事件表,而不是 Connect()....不过,无论如何。

我在 wxPanel 顶部弹出的对话框中有一堆单选按钮。当用户选择一个单选按钮时,我希望有关选择哪个按钮的信息传播回 wxPanel。此按钮的选择决定了已加载到 wxPanel 中的图像会发生什么。

a) 我已经通过在我的对话框类中有一个公共按钮标识符成员来规避这个传播问题,当用户单击单选按钮时会设置它,然后我可以稍后从我的面板类中访问。但是……

b) 为什么这么棘手?我想我们经常遇到这样的情况,一个对话框要求用户输入,然后在父窗口中处理。我是否以错误的方式考虑这个程序设计?例如,我现在是否已经做到了最好的方式?

谢谢大家。

【问题讨论】:

    标签: c++ dialog event-handling wxwidgets


    【解决方案1】:

    您看过 wxWidgets 发行版附带的示例程序吗?他们有很多示例向您展示如何做各种事情

    例如,控件示例有这个事件表:

    BEGIN_EVENT_TABLE(MyPanel, wxPanel)
    EVT_IDLE      (                         MyPanel::OnIdle)
    EVT_BOOKCTRL_PAGE_CHANGING(ID_BOOK,     MyPanel::OnPageChanging)
    EVT_BOOKCTRL_PAGE_CHANGED(ID_BOOK,      MyPanel::OnPageChanged)
    EVT_LISTBOX   (ID_LISTBOX,              MyPanel::OnListBox)
    EVT_LISTBOX   (ID_LISTBOX_SORTED,       MyPanel::OnListBox)
    EVT_LISTBOX_DCLICK(ID_LISTBOX,          MyPanel::OnListBoxDoubleClick)
    EVT_BUTTON    (ID_LISTBOX_SEL_NUM,      MyPanel::OnListBoxButtons)
    EVT_BUTTON    (ID_LISTBOX_SEL_STR,      MyPanel::OnListBoxButtons)
    EVT_BUTTON    (ID_LISTBOX_CLEAR,        MyPanel::OnListBoxButtons)
    EVT_BUTTON    (ID_LISTBOX_APPEND,       MyPanel::OnListBoxButtons)
    EVT_BUTTON    (ID_LISTBOX_DELETE,       MyPanel::OnListBoxButtons)
    EVT_BUTTON    (ID_LISTBOX_FONT,         MyPanel::OnListBoxButtons)
    
    ...
    

    这表明当用户点击例如ID_LISTBOX_CLEAR 按钮,面板方法 MyPanel::OnListBoxButtons() 被调用。

    通常,您可以通过指定事件、控件 ID 和要连接在一起的方法来调用任何类的任何方法。

    “请注意,宏的第二个参数(例如 MyFrame::OnButton1)必须始终是 BEGIN_EVENT_TABLE 的第一个参数中指定的类的成员。” http://wiki.wxwidgets.org/Events#Event_Tables

    所以,如果你想在控件 D 上发生事件 E 时调用 C 类的方法 M,你可以这样写

    BEGIN_EVENT_TABLE( C ... )
    E ( D C:M )
    

    (顺便说一句,使用 wxWidgets v2.9 和 bind() 方法被认为比事件表更可取。既然您似乎对事件表感到困惑,为什么不跳过学习它们并直接转到 v2.9?)

    【讨论】:

    • 作为 MyPanel 事件表的一部分。
    • 你的意思是对话窗口吗?这些是顶层窗口,而不是子窗口。我想你可能把窗口层次结构和你的类继承层次结构混淆了——术语是一样的,但它们是完全不同的。
    【解决方案2】:

    wxDialog 到另一个通常完全不同的顶级窗口的事件传播在实践中被证明是非常令人困惑和出乎意料的,所以虽然它在某些时候确实像这样工作,但它在很久以前就被改变了。如今,如果您真的想从父窗口中的对话框中获取事件,则需要在创建对话框后使用类似

    的方式明确清除wxWS_EX_BLOCK_EVENTS 样式
    dlg.SetExtraStyle(dlg.GetExtraStyle() & ~wxWS_EX_BLOCK_EVENTS);
    

    【讨论】:

    • 好的,我会试试的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多