找回密码
 立即注册
搜索
0

如何在Gtk4上显示右键上下文菜单?

linchen 2024-7-28 11:40:56 63 显示全部楼层
[md]我正尝试在Gtk4窗口上通过鼠标右键点击显示一个上下文菜单。在Gtk3中,我使用`gtk_menu_popup_at_pointer(GTK_MENU(popup), event)`函数来显示上下文菜单,但这个函数在Gtk4中已被移除。在Gtk4中,我该怎么做呢?

我尝试了以下方法,但显示了--- Gtk警告 **: 08:37:09.566: GtkApplicationWindow 0x563d9f0da290正在关闭,但仍然有子控件剩余:massage! 检查这个脚本---

以下是用户尝试的代码示例,并询问如何修正错误,以避免错误发生。

**回答:**
在Gtk4中,创建和显示上下文菜单的方法与Gtk3有所不同。Gtk4推荐使用手势和`GtkPopover`来实现。以下是修改后的代码示例,它演示了如何在Gtk4应用程序中响应鼠标右键点击事件来显示上下文菜单:

```c
// ... 其他代码 ...

static void
on_button_release(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
{
    if (event->button == GDK_BUTTON_SECONDARY) // 检查是否是右键点击
    {
        gtk_popover_popup(GTK_POPOVER(user_data), event->button, event->x_root, event->y_root);
    }
}

// ... 在 create_window 函数中 ...

GtkWidget *popover = gtk_popover_new(NULL); // 创建Popover
// ... 添加菜单项到 popover ...

// 为窗口添加手势控制器以检测鼠标释放事件
GtkGesture *gesture = gtk_gesture_click_new();
gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(gesture), GDK_BUTTON_SECONDARY);
g_signal_connect(gesture, "released", G_CALLBACK(on_button_release), popover);
gtk_widget_add_controller(GTK_WIDGET(gesture), GTK_EVENT_CONTROLLER(gesture));

// ... 其他代码 ...
```

在这个示例中,我们创建了一个`GtkPopover`来作为上下文菜单,并为窗口添加了一个手势控制器来监听鼠标右键释放事件。当检测到右键点击时,我们调用`gtk_popover_popup`函数,并传递事件的坐标来显示Popover。

请注意,你需要根据你的应用程序逻辑来填充`GtkPopover`的菜单项。此外,确保在应用程序退出前正确地清理和释放资源,以避免Gtk警告信息中提到的问题。

修正错误后,你的应用程序应该能够无误地显示右键上下文菜单。如果仍有问题,请确保检查Gtk4的官方文档和更新日志,以获取最新的API使用方式和最佳实践。
[/md]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册