【发布时间】: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 中没有找到等效的调用。