簡體   English   中英

wxWidgets從C ++中的對話框進行事件傳播

[英]wxWidgets Event-Propagation from Dialogs in C++

我對使用wxWidgets進行GUI編程比較陌生。 最近,我感到沮喪的是,對話框上下文中事件傳播的默認行為是不自動將事件傳播回父級。 文檔說,諸如“可能有太多對話框事件需要跟蹤”。 我將事件表用於事件,而不是Connect()。...無論如何。

我在對話框中有一堆單選按鈕,該對話框彈出在wxPanel頂部。 當用戶選擇一個單選按鈕時,我希望有關選擇哪個按鈕的信息傳播回wxPanel。 選擇此按鈕可以確定已加載到wxPanel中的圖像發生了什么。

a)我已經通過在對話框類中有一個公共按鈕標識符成員來避免了這種傳播問題,該對話框成員在用戶單擊單選按鈕時設置,然后我可以稍后從面板類中進行訪問。 但...

b)為什么這么棘手? 我可以想象,經常會有這樣一種情況:對話框要求用戶輸入,然后在父窗口中進行處理。 我是否以錯誤的方式考慮此程序設計? 例如,我現在已經在做最好的方法了嗎?

謝謝大家

您是否看過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 )

(BTW使用wxWidgets v2.9和bind()方法被認為比事件表更可取。由於您似乎對事件表感到困惑,為什么不跳過有關它們的介紹而直接轉到v2.9?)

wxDialog到另一個通常完全不同的頂級窗口的事件傳播在實踐中被證明是非常混亂和出乎意料的,因此,盡管它在某些時候確實如此工作,但在很久以前就進行了更改。 如今,如果您真的想從父窗口的對話框中獲取事件,則需要在創建對話框之后使用類似以下的方法來明確清除wxWS_EX_BLOCK_EVENTS樣式

dlg.SetExtraStyle(dlg.GetExtraStyle() & ~wxWS_EX_BLOCK_EVENTS);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM