在菜单中显示加速键

Show accelerator key in menu

我在 Ubuntu 上使用 Gtkmm 3.22.30,我一直试图在我的应用程序菜单中显示快捷键,但没有成功。到目前为止,我已经能够为我的菜单项注册加速键,但由于某种原因,它们没有出现在我的菜单中。我知道这是可能的,因为我在 Inkscape 中看到过它,我相信它也在使用 Gtkmm(例如:New is bound to <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 标志,但我没有找到任何文档),但除了一个空白 space。当我点击 Ctrl + y 时,“Handler called”出现在控制台中,所以加速器工作了。

我已经查看了 API,但它非常混乱且记录不完整(我无法找到 Gtkmm 3.22.30 的工作示例,甚至在源代码随附的示例中也找不到) .

我怎样才能做到这一点?

备注:

  1. 我正在寻找一个尽可能不涉及Gtk::Builder的答案。
  2. 如果我想做的事情在 Gtkmm 中是不可能的,答案可以使用 C 代码,但我需要它与我的 Gtkmm 代码集成。
add_accel_group(accel_group);
m_menu.set_accel_group(accel_group);

我认为不能将同一个 AccelGroup 分配给 window 菜单。我在文档中搜索了这方面的详细信息,但一无所获,但我的肚子告诉我你必须删除其中一行。在 this example 中,他们也仅在 window 中使用 AccelGroup。我建议删除第二行。

编辑:我认为您使用的 Gtkmm 版本与我不同,因为您提供的代码在我的机器上运行良好。您能否编译以下 C++ 程序,运行 它和 post 它的输出?

#include <gtkmm.h>
#include <iostream>

int main() {
    cout << gtk_get_major_version() << "." << gtk_get_minor_version() << "." << gtk_get_micro_version();
}