【问题标题】:Process an event using EVT_NAVIGATION_KEY doesn't work使用 EVT_NAVIGATION_KEY 处理事件不起作用
【发布时间】:2015-03-31 02:52:04
【问题描述】:

头文件:

class ttFrame: public wxFrame
{
    public:
        ttFrame(wxFrame *frame, const wxString& title);
        ~ttFrame();
    private:
        enum
        {
            idMenuQuit = 1000,
            idMenuAbout,
            collapsible_key
        };
        void OnClose(wxCloseEvent& event);
        void OnQuit(wxCommandEvent& event);
        void OnAbout(wxCommandEvent& event);
        void OnEvent(wxCommandEvent& event);
        void OnSpinEvent(wxSpinEvent& event);
        wxCollapsiblePane *collpane;
        void OnEventCollapsible(wxNavigationKeyEvent& event);
        DECLARE_EVENT_TABLE()
};

主要功能:

wxBoxSizer *sizer = new wxBoxSizer(wxHORIZONTAL);

collpane = new wxCollapsiblePane(this, collapsible_key, "Collapsible pane:", wxDefaultPosition, wxSize(400,400), wxCP_NO_TLW_RESIZE);
sizer->Add(collpane);

    wxWindow *win = collpane->GetPane();
    wxSizer *paneSz = new wxBoxSizer(wxVERTICAL);

    paneSz->Add(new wxStaticText(win, wxID_ANY, "test!"), 1, wxGROW|wxALL, 2);

    win->SetSizer(paneSz);
    paneSz->SetSizeHints(win);

SetSizer(sizer);

事件声明:

BEGIN_EVENT_TABLE(ttFrame, wxFrame)
    EVT_NAVIGATION_KEY(ttFrame::OnEventCollapsible)
END_EVENT_TABLE()

事件函数发射器:

void ttFrame::OnEventCollapsible(wxNavigationKeyEvent& event)
{
    wxMessageBox("Not event trigger on key TAB");
}

当我点击 TAB 键或某个功能键时,它不会触发事件。其他事件如 EVT_COLLAPSIBLEPANE_CHANGED(id, func): 有效。

在文档中说

EVT_NAVIGATION_KEY(func):处理导航键事件。

事件不会触发以显示 wxMessageBox()。

【问题讨论】:

    标签: c++ events controls wxwidgets


    【解决方案1】:

    据我所知,wxFrame 不会发出 wxNavigationKeyEvent。获得TAB 导航的标准方法是将wxPanel 添加为wxFrame 的唯一子项,然后将所有控件添加为wxPanel 的子项。文档here.

    更新:我错了,我刚刚验证了 wxFrame 确实 实际上也发出了该事件。与wxPanel 的不同之处在于没有默认导航处理程序——除非你自己做,否则TAB 在控件直接添加到wxFrame 时不会在控件之间导航。

    但是,在您的情况下,您还有另一个wxPanel - 包含在wxCollapsiblePane 中的那个。您还需要将事件处理程序绑定到该面板 (collpane->GetPane()->Bind(/*...*/)) 以捕获其事件。

    在这两个处理程序之间,您应该在您的案例中捕获所有相关的导航事件。

    更新 2:wxCollapsiblePane 也实现了导航,因此当焦点从窗格外部切换到其包含的 wxPanel 并返回时,将处理程序绑定到它也会捕获其他事件。不确定这如何有用。如果至少有两个控件添加到wxCollapsiblePane 的内部面板,为了捕捉它们之间的导航事件,您仍然需要绑定到collpane->GetPane() 的处理程序。

    【讨论】:

    • 不,我试过了,但这没有用。它应该与主框架窗口绑定以触发关键事件。但这里有一些有趣的示例,但我不知道如何在这种情况下实现。这是来自 filezilla 示例文件和事件处理程序内部的事件键构造函数:code.metager.de/source/xref/filezilla/src/interface/… 在代码中BEGIN_EVENT_TABLE(ttFrame, wxFrame) 应该接收事件键处理程序,例如BEGIN_EVENT_TABLE(ttFrame, wxFrame, eventkey)
    • 您究竟尝试了什么但没有奏效?您是否从wxPanel 派生了一个类,为该类 设置了一个事件表,其中包含wxNavigationKeyEvent 的处理程序,但它没有触发?
    • 确切地说,它不会触发 wxPanel 从类派生并添加事件的事件。我现在正在尝试这样:collpane->Connect(wxEVT_NAVIGATION_KEY, wxNavigationKeyEvent(ttFrame::OnEventCollapsible), NULL, this);
    • 不,不要将事件处理程序绑定到可折叠窗格,将其绑定到可折叠窗格的内部wxPanel,即您从collpane->GetPane() 获得的那个。当该窗格内的控件具有焦点时,就会由该面板生成导航事件。
    • 基本上,在你的情况下,你有 两个 wxPanels:你的类派生自一个,内部一个来自wxCollapsiblePane。为了捕获所有导航事件,您需要将处理程序绑定到这两个面板。可折叠窗格在这里使事情变得有些复杂。您可以尝试从一个更简单的案例开始,在主要的 wxPanel 中只有一个 wxTextCtrl,看看它是否有效,然后从那里开始。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 2012-01-26
    • 2018-12-19
    相关资源
    最近更新 更多