C++ GTK库如何实现窗口导航 解决无法切回前序窗口问题
问题原因分析
- 初始化阶段你同时调用
gtk_widget_show_all(window1)和gtk_widget_show_all(window2),两个全屏顶层窗口同时存在,窗口管理器默认会将后渲染的window2固定在堆叠顶层,仅对window1调用gtk_window_fullscreen无法修改堆叠顺序。 - 现有回调逻辑仅对目标窗口执行全屏操作,没有处理当前窗口的层级、也没有主动触发目标窗口的顶层激活逻辑,无法生效是正常现象。
可行解决方案
修改两处核心逻辑即可解决问题:
- 初始化时仅显示第一个窗口,第二个窗口默认隐藏,避免同时存在两个全屏顶层窗口
- 回调函数中先隐藏当前窗口,再主动激活目标窗口,兼容窗口管理器的置顶限制
修改后的完整代码如下:
#include <gtk/gtk.h> void callback(GtkWidget *wid, gpointer ptr) { // 隐藏当前按钮所属的上层窗口 GtkWidget *current_win = gtk_widget_get_toplevel(wid); gtk_widget_hide(current_win); // 显示并激活目标窗口 GtkWidget *target_win = static_cast<GtkWidget*>(ptr); gtk_widget_show(target_win); // 带时间戳的置顶接口,兼容性优于普通gtk_window_present gtk_window_present_with_time(GTK_WINDOW(target_win), GDK_CURRENT_TIME); gtk_window_fullscreen(GTK_WINDOW(target_win)); } int main() { gtk_init(NULL,NULL); GtkWidget *window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window1), "1th window"); gtk_window_fullscreen(GTK_WINDOW(window1)); GtkWidget *btn1 = gtk_button_new_with_label ("Go to 2th window"); gtk_container_add (GTK_CONTAINER (window1), btn1); gtk_widget_show_all(window1); GtkWidget *window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window2), "2th window"); GtkWidget *btn2 = gtk_button_new_with_label ("Go back to 1th window"); gtk_container_add (GTK_CONTAINER (window2), btn2); g_signal_connect(window1,"delete-event",G_CALLBACK(gtk_main_quit),NULL); g_signal_connect(window2,"delete-event",G_CALLBACK(gtk_main_quit),NULL); g_signal_connect (btn1, "clicked", G_CALLBACK (callback),window2); g_signal_connect (btn2, "clicked", G_CALLBACK (callback),window1); // 初始化阶段不显示window2,避免堆叠冲突 // gtk_widget_show_all(window2); gtk_main(); return 0; }
如果不需要保留窗口的后台状态,也可以在切换时直接销毁旧窗口、下次切换再新建,性能开销对于简单GUI完全可接受,也能从根源避免窗口堆叠冲突。
内容的提问来源于stack exchange,提问作者BSmaster
相关产品推荐
相关产品推荐

