在菜单中显示加速键
Posted
技术标签:
【中文标题】在菜单中显示加速键【英文标题】:Show accelerator key in menu 【发布时间】:2021-02-04 01:52:06 【问题描述】:我在 Ubuntu 上使用 Gtkmm 3.22.30,我一直试图在我的应用程序菜单中显示加速键,但没有成功。到目前为止,我已经能够为我的菜单项注册一个加速键,但由于某种原因,它们没有出现在我的菜单中。我知道这是可能的,因为我在 Inkscape 中看到过,我相信它也在使用 Gtkmm(例如:New 绑定到<Control>N
:
我准备了一个最小的例子来展示我的问题(以及我做了什么)。代码如下:
#include <gtkmm.h>
#include <iostream>
class MainWindow : public Gtk::ApplicationWindow
public:
MainWindow();
private:
void OnActivateSubItem()
std::cout << "Handler called" << std::endl;
Gtk::MenuBar m_menuBar;
Gtk::MenuItem m_mainMenu"Menu";
Gtk::Menu m_menu;
Gtk::MenuItem m_subItem"Item"; // Menu|Item
;
MainWindow::MainWindow()
// Setting the menu up:
add(m_menuBar);
m_menuBar.append(m_mainMenu);
m_mainMenu.set_submenu(m_menu);
m_menu.append(m_subItem);
// Adding accelerator:
auto accel_group = Gtk::AccelGroup::create();
add_accel_group(accel_group);
m_menu.set_accel_group(accel_group);
// I would have believed this to do the trick but, meh...
m_subItem.add_accelerator("activate",
accel_group,
GDK_KEY_y,
Gdk::ModifierType::CONTROL_MASK,
Gtk::ACCEL_VISIBLE);
m_subItem.signal_activate().connect([this]OnActivateSubItem(););
int main()
auto app = Gtk::Application::create("my.menu.problem");
MainWindow window;
window.show_all();
return app->run(window);
导致以下结果:
我期待在Item
菜单项旁边有一个Ctrl + y
条目(尤其是我没有找到任何文档的Gtk::ACCEL_VISIBLE
标志),但除了空白之外什么都没有显示。当我点击Ctrl + y
时,控制台中出现“Handler called”,所以加速器工作了。
我查看了 API,但它非常令人困惑且记录不充分(我无法找到 Gtkmm 3.22.30 的工作示例,甚至在源代码附带的示例中也找不到)。
我怎样才能做到这一点?
注意事项:
-
如果可能,我正在寻找不涉及
Gtk::Builder
的答案。
如果我想做的事情在 Gtkmm 中无法实现,答案可以使用 C 代码,但我需要它与我的 Gtkmm 代码集成。
【问题讨论】:
加速键。那是一个新的。和热键有什么区别?不是在这里讽刺。我真的很想知道它们是否相同。 我认为它们是相同的。来自Gtkmm documentation:“例如,按 Control-Q 激活 File|Quit 菜单项。” 谢谢。伙计,我希望没有人拥有热键的专利或商标。 有很多方法可以做到这一点,但我认为最简单的一种是GtkAccelLabel。无论如何,如果它只是关于菜单的操作,那么可能是This is what you need 我需要一些带有 C++ 绑定 (Gtkmm) 的东西。某些 GTK 函数似乎在 Gtkmm 中没有等效函数。例如,如何将GtkAccelLabel
添加到MenuItem
?在 GTK 中,似乎有调用 gtk_menu_item_new_with_label()
来完成这项工作,但我在 GTKmm 中没有找到等效的调用。
【参考方案1】:
add_accel_group(accel_group); m_menu.set_accel_group(accel_group);
我认为不能将同一个 AccelGroup 分配给一个窗口和一个菜单。我在文档中搜索了有关此内容的详细信息,但一无所获,但我的肚子感觉告诉我您必须删除其中一行。在this example 中,他们也仅在窗口中使用 AccelGroup。我建议删除第二行。
编辑:我认为您使用的 Gtkmm 版本与我不同,因为您提供的代码在我的机器上运行良好。能否请您编译以下 c++ 程序,运行它并发布它的输出?
#include <gtkmm.h>
#include <iostream>
int main()
cout << gtk_get_major_version() << "." << gtk_get_minor_version() << "." << gtk_get_micro_version();
【讨论】:
感谢您抽出宝贵时间查看。今晚我会编译并运行它,然后告诉你。 @BobMorane 没问题! 印刷版是3.22.30
@BobMorane 好的,我的是 3.24.24,所以它可能是一个错误。您是否尝试删除我提到的其中一行?
是的,我试过了。如果我删除add_accel_group(accel_group);
,加速器将不再工作......我也开始相信这是一个错误。出于好奇,你在运行 Ubuntu 吗?以上是关于在菜单中显示加速键的主要内容,如果未能解决你的问题,请参考以下文章