在菜单中显示加速键

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 吗?

以上是关于在菜单中显示加速键的主要内容,如果未能解决你的问题,请参考以下文章

禁用 Alt 键访问 Windows 菜单/导致菜单加速

Owner-Draw 菜单项的菜单加速键(下划线)

win32day06-系统菜单/右键菜单/资源的使用/字符串资源/菜单资源/加速键资源

鼠标右键有个360一键加速怎么弄掉。。.......

JavaFX - 在菜单中显示加速器修饰符

鼠标右键有个360一键加速怎么弄掉。。.......