gtkmm: как создать всплывающее меню без конструктора?

#c #gtk #gtkmm

#c #gtk #gtkmm

Вопрос:

Я пытаюсь создать приложение GTK3 на C . Поскольку это мое первое приложение gtkmm и оно действительно маленькое, я избегаю builder и размещаю виджеты с помощью простого кода.

У меня есть такой фрагмент для кнопки меню в строке заголовка:

 Gtk::MenuButton mbtn;
Gtk::Menu menu;
Gtk::MenuItem mnitSettings {"Settings"};
Gtk::MenuItem mnitAbout {"About"};
mbtn.set_image_from_icon_name("open-menu-symbolic");
menu.append(mnitSettings);
menu.append(mnitAbout);
menu.show_all();
mbtn.set_popup(menu);
  

Это работает нормально, но я заметил, что в большинстве приложений GTK3 есть что-то вроде Gtk :: Popover для меню кнопки, у которого есть анимация перехода и указывающая стрелка на его краю. К моему сожалению, большинство приложений GTK3 используют builder, поэтому я не могу понять, как это сделать.

Есть Gtk::MenuButton::set_popover (Gtk:: Popover amp;), но мне не удалось добавить свое меню во всплывающую оболочку (я получил "Attempting to add a widget with type gtkmm__GtkMenu to a container of type gtkmm__GtkPopover, but the widget is already inside a container of type GtkWindow" предупреждение).

Как можно было бы создать всплывающее меню в этом случае?

Ответ №1:

Я только что выяснил, как это сделать.

 Gtk::MenuButton mbtn;
Glib::RefPtr<Gio::Menu> menu = Gio::Menu::create();
menu->append("Settings", "app.settings");
menu->append("About", "app.about");
mbtn.set_menu_model(menu);
  

Действия могут быть прикреплены с:

 app->add_action("settings", glibc::ptr_fun(amp;some_useful_func));