[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] |