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

如何打开新GTK窗口后关闭原窗口?C语言GTK开发求助

GTK主窗口无法关闭的问题解决

问题说明

在Linux Mint系统的VSCode中用C语言开发GTK简易菜单,需求是点击主窗口按钮时打开新窗口并关闭原窗口,但点击按钮打开新窗口后,原窗口始终关不掉。

错误原因

你写的代码里,给按钮的clicked信号绑定回调函数时,传递的附加数据是NULL:

g_signal_connect(opt1, "clicked", G_CALLBACK(submenu), NULL);

而GTK信号回调函数的第一个参数永远是触发信号的控件(这里就是你点击的按钮opt1),不是你以为的主窗口。所以你在submenu函数里调用gtk_window_close(window),实际上是在尝试关闭按钮,而不是主窗口,这当然不会有效果。

解决方法

把主窗口作为附加数据传递给回调函数,同时调整回调函数的参数格式,符合GTK信号回调的规范:

  1. 调整submenu函数的参数:第一个参数是触发点击的按钮(可以不用,但必须保留位置),第二个参数才是我们要关闭的主窗口
  2. 绑定信号时,把主窗口window作为最后一个参数传递进去

修改后的完整代码

#include <stdlib.h>
#include <stdio.h>
#include <gtk/gtk.h>

// 调整参数:第一个是触发点击的按钮,第二个是主窗口(我们要关闭的窗口)
void submenu (GtkWidget *button, gpointer main_window){
    // 这里用main_window来关闭主窗口
    gtk_window_close(GTK_WINDOW(main_window));
    
    GtkWidget *window2, *result2, *fixed2, *opt12, *opt22, *opt32, *opt42, *opt52;

    window2 = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW (window2), "Test");
    gtk_window_set_default_size (GTK_WINDOW (window2), 828, 512);
    gtk_window_set_position(GTK_WINDOW(window2), GTK_WIN_POS_CENTER);
    g_signal_connect(window2, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    fixed2 = gtk_fixed_new();
    gtk_container_add(GTK_CONTAINER(window2), fixed2);

    result2 = gtk_label_new("Choose an option");
    gtk_fixed_put(GTK_FIXED(fixed2), result2, 374, 100);
    gtk_widget_set_size_request(result2, 80, 30);

    opt12 = gtk_button_new_with_label("Option 1");
    gtk_fixed_put(GTK_FIXED(fixed2), opt12, 289, 180);
    gtk_widget_set_size_request(opt12, 250, 30);

    opt22 = gtk_button_new_with_label("Option 2");
    gtk_fixed_put(GTK_FIXED(fixed2), opt22, 289, 220);
    gtk_widget_set_size_request(opt22, 250, 30);

    opt32 = gtk_button_new_with_label("Option 3");
    gtk_fixed_put(GTK_FIXED(fixed2), opt32, 289, 260);
    gtk_widget_set_size_request(opt32, 250, 30);

    opt42 = gtk_button_new_with_label("Option 4");
    gtk_fixed_put(GTK_FIXED(fixed2), opt42, 289, 300);
    gtk_widget_set_size_request(opt42, 250, 30);

    opt52 = gtk_button_new_with_label("Option 5");
    gtk_fixed_put(GTK_FIXED(fixed2), opt52, 289, 340);
    gtk_widget_set_size_request(opt52, 250, 30);
    
    gtk_widget_show_all(window2);
}

void menu (){
    GtkWidget *window, *result, *fixed, *opt1, *opt2, *opt3, *opt4, *opt5;

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW (window), "Main menu");
    gtk_window_set_default_size (GTK_WINDOW (window), 828, 512);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    fixed = gtk_fixed_new();
    gtk_container_add(GTK_CONTAINER(window), fixed);

    result = gtk_label_new("Escolha uma Option");
    gtk_fixed_put(GTK_FIXED(fixed), result, 374, 100);
    gtk_widget_set_size_request(result, 80, 30);

    opt1 = gtk_button_new_with_label("Option 1");
    gtk_fixed_put(GTK_FIXED(fixed), opt1, 289, 180);
    gtk_widget_set_size_request(opt1, 250, 30);
    // 把主窗口window作为附加数据传递给submenu
    g_signal_connect(opt1, "clicked", G_CALLBACK(submenu), window);

    opt2 = gtk_button_new_with_label("Option 2");
    gtk_fixed_put(GTK_FIXED(fixed), opt2, 289, 220);
    gtk_widget_set_size_request(opt2, 250, 30);

    opt3 = gtk_button_new_with_label("Option 3");
    gtk_fixed_put(GTK_FIXED(fixed), opt3, 289, 260);
    gtk_widget_set_size_request(opt3, 250, 30);

    opt4 = gtk_button_new_with_label("Option 4");
    gtk_fixed_put(GTK_FIXED(fixed), opt4, 289, 300);
    gtk_widget_set_size_request(opt4, 250, 30);

    opt5 = gtk_button_new_with_label("Option 5");
    gtk_fixed_put(GTK_FIXED(fixed), opt5, 289, 340);
    gtk_widget_set_size_request(opt5, 250, 30);
    
    gtk_widget_show_all(window);
}

int main(int argc, char **argv) {

    gtk_init(&argc, &argv);

    menu();

    gtk_main();

    return 0;
}

编译命令

gcc intertest.c -o intertest `pkg-config --cflags gtk+-3.0` `pkg-config --libs gtk+-3.0`

内容的提问来源于stack exchange,提问作者Kawano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:05:30