c++ - 助记符和自定义小部件
问题描述
我有一个带有助记符的标签,它位于自定义小部件之前 - 只是一个从 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?)上。
解决方案
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 的期望。
现在恐怕我只能建议将标签放在面板内,因为即使我已经为这个问题创建了一张票并且可能有办法解决它,但它不是微不足道的,所以风险不会在附近发生未来。
推荐阅读
- proxy - 用于 HTTP/2 的 Netty ProxyHandler
- angular - Angular:如何动态选择选择组件的第一项
- android - 单击项目时显示的值
- tensorflow - tensorflow 数据集 shuffle 然后批处理或批处理然后 shuffle
- python - C++ 类:如何使用 dict["hello"]=20; 像 Python
- javascript - 具有输入值的 JSON 对象的索引
- python - 为什么默认情况下没有将 pip 包安装到 $PATH 到?
- r - R:混合多列并根据字符串条件从一列中选择行值
- django - 为什么要使用 Django 模型管理器?
- python - 元音列表:奇怪的 lambda 表达式