Как отобразить контекстное меню при щелчке правой кнопкой мыши Gtk.TreeView?

avatar
g_l
8 апреля 2018 в 08:05
3300
2
3

Я пытаюсь отобразить пользовательское контекстное меню, когда щелкаю правой кнопкой мыши строку в TreeView.

treeView.button_press_event.connect ((event) => {
    if (event.type == EventType.BUTTON_PRESS && event.button == 3) {
        Gtk.Menu menu = new Gtk.Menu ();
        Gtk.MenuItem menu_item = new Gtk.MenuItem.with_label ("Add file");
        menu.add (menu_item);
        menu.show ();
    }
});

Он ничего не показывает. Если я отлаживаю сообщение, я вижу, что блок выполняется при щелчке правой кнопкой мыши по строке в TreeView. Я пробовал show_all(), но безуспешно. popup_at_pointer() доступен только в Gtk+ 3.22 и более поздних версиях. Я использую Gtk+ 3.18.

Есть ли способ отобразить пользовательское меню при щелчке правой кнопкой мыши по строке в Gtk.TreeView?

Источник

Ответы (2)

avatar
g_l
8 апреля 2018 в 16:59
2

Обнаружено, что нужно прикрепить Gtk.Menu к виджету, используя attach_to_widget(), а затем использовать show_all() перед вызовом единственного метода для отображения меню, доступного в Gtk+ 3.18, который представляет собой всплывающее окно (...). popup (...) устарел, начиная с Gtk+ 3.22, но это единственный метод, доступный в Gtk+ 3.18.

Вот код

treeView.button_press_event.connect ((event) => {
    if (event.type == EventType.BUTTON_PRESS && event.button == 3) {
        Gtk.Menu menu = new Gtk.Menu ();
        Gtk.MenuItem menu_item = new Gtk.MenuItem.with_label ("Add file");
        menu.attach_to_widget (treeView, null);
        menu.add (menu_item);
        menu.show_all ();
        menu.popup (null, null, null, event.button, event.time);
    }
});

Соответствующий источник: https://developer.gnome.org/gtkmm-tutorial/stable/sec-treeview-examples.html.en#treeview-popup-menu-example

Shadi
9 сентября 2020 в 06:28
0

Для библиотеки gtk rust это будет означать connect_button_press_event

avatar
theGtknerd
8 апреля 2018 в 10:47
1

Я думаю, вам нужен старый стиль gtk_menu_popup.