GTK+3开发:如何禁用或移除窗口顶部的关闭按钮?
解决GTK3绘图窗口关闭按钮导致的销毁问题
我之前在Gnome桌面下开发GTK应用时也碰到过类似的窗口装饰设置不生效的问题,给你几个可靠的解决方案:
核心思路:拦截delete-event信号,替换默认销毁行为
当用户点击窗口右上角的"x"按钮时,GTK会触发delete-event信号,默认逻辑是直接销毁窗口。我们只需要拦截这个信号,把行为改成隐藏窗口(和你的Cancel按钮逻辑一致),就能避免窗口被销毁,再次点击Plot按钮时直接显示即可。
步骤1:编写delete-event回调函数
gboolean plot_window_delete_handler(GtkWidget *window, GdkEvent *event, gpointer user_data) { // 隐藏窗口而非销毁 gtk_widget_hide(window); // 返回TRUE表示我们已处理该事件,阻止默认的销毁行为 return TRUE; }
步骤2:给绘图窗口绑定这个信号
在你创建绘图窗口的代码段中,添加信号绑定逻辑:
// 假设你已创建绘图窗口:GtkWidget *plot_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(plot_window, "delete-event", G_CALLBACK(plot_window_delete_handler), NULL); // 保留你原有的其他设置,比如添加Cancel按钮、GtkDrawingArea等 GtkWidget *cancel_btn = gtk_button_new_with_label("Cancel"); g_signal_connect(cancel_btn, "clicked", G_CALLBACK(on_cancel_clicked), plot_window); // ... 其他布局与绘图相关代码
修改后,不管是点击Cancel按钮还是窗口的"x"按钮,窗口都会被隐藏而非销毁。再次点击Plot按钮时,只需调用gtk_widget_show(plot_window)就能正常显示红色方块,不会出现报错。
为什么你之前的方法没生效?
- 移除decorated属性:确实会丢失窗口拖动功能,这个方案体验太差,完全没必要采用。
gtk_window_set_deletable(window, FALSE):在Gnome(使用Mutter窗口管理器)环境下,窗口的装饰元素(包括关闭按钮)是由窗口管理器控制的,GTK的这个设置有时无法覆盖窗口管理器的行为,所以会出现按钮仍存在、点击仍销毁的情况。而拦截delete-event信号是直接在GTK层面处理事件,不受窗口管理器影响,兼容性和可靠性更强。
如果需要完整的代码示例,可以告诉我,我可以帮你补充更多细节。
内容的提问来源于stack exchange,提问作者arkkimede
相关产品推荐
相关产品推荐

