如何打开新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信号回调的规范:
- 调整
submenu函数的参数:第一个参数是触发点击的按钮(可以不用,但必须保留位置),第二个参数才是我们要关闭的主窗口 - 绑定信号时,把主窗口
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
相关产品推荐
相关产品推荐

