如何解决在菜单中显示加速键
我在 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);
}
导致以下结果:
我期待在 Ctrl + y
菜单项旁边有一个 Item
条目(特别是带有 Gtk::ACCEL_VISIBLE
标志,但我没有找到相关文档),但除了一个空格之外什么都没有显示.当我点击 Ctrl + y
时,控制台中会出现“Handler called”,因此加速器起作用了。
我已经浏览了 API,但它非常令人困惑并且文档很差(我找不到 Gtkmm 3.22.30 的工作示例,甚至在源代码附带的示例中也找不到)。
我怎样才能做到这一点?
注意事项:
- 如果可能,我正在寻找不涉及
Gtk::Builder
的答案。 - 如果 Gtkmm 无法实现我想要做的事情,答案可以使用 C 代码,但我需要它与我的 Gtkmm 代码集成。
解决方法
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();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。