You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ GTK库如何实现窗口导航 解决无法切回前序窗口问题

问题原因分析
  • 初始化阶段你同时调用gtk_widget_show_all(window1)和gtk_widget_show_all(window2),两个全屏顶层窗口同时存在,窗口管理器默认会将后渲染的window2固定在堆叠顶层,仅对window1调用gtk_window_fullscreen无法修改堆叠顺序。
  • 现有回调逻辑仅对目标窗口执行全屏操作,没有处理当前窗口的层级、也没有主动触发目标窗口的顶层激活逻辑,无法生效是正常现象。
可行解决方案

修改两处核心逻辑即可解决问题:

  1. 初始化时仅显示第一个窗口,第二个窗口默认隐藏,避免同时存在两个全屏顶层窗口
  2. 回调函数中先隐藏当前窗口,再主动激活目标窗口,兼容窗口管理器的置顶限制

修改后的完整代码如下:

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 16:15:02