首页 > 解决方案 > 助记符和自定义小部件

问题描述

我有一个带有助记符的标签,它位于自定义小部件之前 - 只是一个从 wxPanel 派生的复合小部件,没什么花哨的。见下图。

在此处输入图像描述

问题是,我似乎无法使用助记符。

我天真地期望自定义小部件获得焦点,但似乎并非如此。

那么,助记符背后的机制是什么?应该如何使自定义小部件与它们一起使用?


编辑:添加一个最小的示例代码来说明问题。

它与位于存储库的v3.0.5分支中的 minimum.cpp 示例程序不同。

在 Linux 上测试,使用 GTK3。配置选项:--enable-shared --disable-static --enable-unicode --enable-printfposparam --enable-debug --with-gtk=3

与 minimum.cpp 的区别:

diff --git a/samples/minimal/minimal.cpp b/samples/minimal/minimal.cpp
index 135595c9fb..b656000879 100644
--- a/samples/minimal/minimal.cpp
+++ b/samples/minimal/minimal.cpp
@@ -172,6 +172,26 @@ MyFrame::MyFrame(const wxString& title)
     CreateStatusBar(2);
     SetStatusText("Welcome to wxWidgets!");
 #endif // wxUSE_STATUSBAR
+
+       wxPanel *root = new wxPanel(this); {
+           wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
+    
+           wxStaticText *label = new wxStaticText(root, wxID_ANY, wxS("T&est"));
+           wxPanel *panel = new wxPanel(root); {
+               wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
+               wxTextCtrl *text = new wxTextCtrl(panel, wxID_ANY);
+               sizer->Add(text, wxSizerFlags(0).Expand());
+               panel->SetSizerAndFit(sizer);
+           }
+    
+           wxTextCtrl *text2 = new wxTextCtrl(root, wxID_ANY);
+    
+           sizer->Add(label, wxSizerFlags(0).Expand());
+           sizer->Add(panel, wxSizerFlags(0).Expand());
+           sizer->Add(text2, wxSizerFlags(0).Expand());
+    
+           root->SetSizerAndFit(sizer);
+       }
 }

我期望能够按 ALT+e 并使第一个 wxTextCtrl 获得焦点,但第二个获得焦点。如果我从代码中删除第二个,我会在控制台上看到以下行:

(minimal:2409662): Gtk-WARNING **: 01:58:45.676: Couldn't find a target for a mnemonic activation.

EDIT2:我之前发布的代码在 Windows 上根本不起作用,显示其他类型的问题。原来我需要使用wxPanel 来嵌入小部件,而不是直接将它们放在 wxFrame 中。完成该修改后,上面的代码现在可以在 Windows 目标上正常工作。所以问题似乎出在GTK(3?)上。

标签: c++wxwidgets

解决方案


wxStaticText 不幸的是,在 wxGTK 中使用 a before而不是inside a确实存在问题wxPanel。3.1 给出了更有用的警告信息:

widget 'wxPizza' isn't suitable for mnemonic activation

并且查看 GTK 源代码gtk_widget_real_mnemonic_activate()是因为它自己gtk_widget_get_can_focus()返回 false wxPanel,这似乎是有道理的,因为面板不应该自己关注焦点,只有它的孩子是,但显然违背了 GTK 的期望。

现在恐怕我只能建议将标签放在面板内,因为即使我已经为这个问题创建了一张票并且可能有办法解决它,但它不是微不足道的,所以风险不会在附近发生未来。


推荐阅读