在菜单中显示加速键
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 的工作示例,甚至在源代码随附的示例中也找不到) .
我怎样才能做到这一点?
备注:
- 我正在寻找一个尽可能不涉及
Gtk::Builder
的答案。
- 如果我想做的事情在 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();
}
我在 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 的工作示例,甚至在源代码随附的示例中也找不到) .
我怎样才能做到这一点?
备注:
- 我正在寻找一个尽可能不涉及
Gtk::Builder
的答案。 - 如果我想做的事情在 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();
}