gtk-使用C中的按钮关闭窗口窗体
我有一个带有菜单的主窗口,可以打开另一个窗口。此辅助窗口有一个关闭按钮。该按钮已连接信号。我的问题是我不知道如何关闭/销毁父窗口。我尝试过gtk_widget_destroy,但出现了一个错误,因为窗口不是widget。。。。我还没有找到任何破坏父窗口的函数 谁能给我指路吗? 提前谢谢 ----------------------------------------------- 嗯。我发布了一段代码。当我执行程序时,我点击“打开窗口”按钮。一个按钮“关闭”打开一个新窗口。如果我点击“关闭”按钮,我会在终端中看到下一个错误:(Windows:13801):Gtk严重**:Gtk_小部件_销毁:断言“Gtk_是_小部件(小部件)”失败 代码是:gtk-使用C中的按钮关闭窗口窗体,c,gtk,C,Gtk,我有一个带有菜单的主窗口,可以打开另一个窗口。此辅助窗口有一个关闭按钮。该按钮已连接信号。我的问题是我不知道如何关闭/销毁父窗口。我尝试过gtk_widget_destroy,但出现了一个错误,因为窗口不是widget。。。。我还没有找到任何破坏父窗口的函数 谁能给我指路吗? 提前谢谢 ----------------------------------------------- 嗯。我发布了一段代码。当我执行程序时,我点击“打开窗口”按钮。一个按钮“关闭”打开一个新窗口。如果我点击“关闭”按钮
#include <stdlib.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
void open_window(GtkWidget *widget, gpointer window);
void close_window(GtkWidget *widget, gpointer window);
int main( int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *fixed;
GtkWidget *button;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Windows");
gtk_window_set_default_size(GTK_WINDOW(window), 230, 150);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
fixed = gtk_fixed_new();
gtk_container_add(GTK_CONTAINER(window), fixed);
button = gtk_button_new_with_label("Open window");
gtk_fixed_put(GTK_FIXED(fixed), button, 50, 50);
gtk_widget_set_size_request(button, 80, 35);
g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(open_window), G_OBJECT(window));
g_signal_connect_swapped(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
void open_window(GtkWidget *widget, gpointer window)
{
GtkBuilder *builder;
GtkWidget *secondWindow = NULL;
builder = gtk_builder_new ();
gtk_builder_add_from_file (builder, "secondWindow.glade", NULL);
secondWindow = GTK_WIDGET (gtk_builder_get_object (builder, "secondWindow"));
gtk_builder_connect_signals (builder, NULL);
g_object_unref (G_OBJECT (builder));
gtk_window_set_modal(GTK_WINDOW(secondWindow), TRUE);
gtk_widget_show_all(secondWindow);
}
void close_window(GtkWidget *widget, gpointer window)
{
gtk_widget_destroy(GTK_WIDGET(window));
}
您的问题是,第二个窗口按钮的“单击”信号是从glade文件连接的。但是信号处理程序需要一个指向窗口的指针来销毁它。这是通过信号回调的“user_data”参数传递的
一种方法是将第二个窗口作为Glade中的user_data参数传递(请看一看),但该参数应该是指针,我不知道如何使用Glade实现编辑:只需在glade中单击与此信号关联的用户数据字段,弹出窗口将允许您选择要传递给信号处理程序的对象。只需选择“secondWindow”对象
另一种方法是从glade文件中删除信号处理,并从代码中手动连接单击的信号,将指针作为用户数据传递到第二个窗口:
void open_window(GtkWidget *widget, gpointer window)
{
GtkBuilder *builder;
GtkWidget *secondWindow = NULL;
GtkWidget *closeButton = NULL;
builder = gtk_builder_new ();
gtk_builder_add_from_file (builder, "secondWindow.glade", NULL);
secondWindow = GTK_WIDGET (gtk_builder_get_object (builder, "secondWindow"));
closeButton = GTK_WIDGET (gtk_builder_get_object (builder, "closeWindowButton"));
g_signal_connect (G_OBJECT (closeButton),
"clicked",
G_CALLBACK (close_window),
G_OBJECT (secondWindow)); // here is the magic: the callback will get the window to close
g_object_unref (G_OBJECT (builder));
gtk_window_set_modal(GTK_WINDOW(secondWindow), TRUE);
gtk_widget_show_all(secondWindow);
}
是一个GtkWidget。你可以隐藏它。从用户体验的角度来看,点击一个辅助窗口关闭第一个窗口看起来有点奇怪。你想达到什么目标?也许有更好的办法。请同时指定您的GTK版本。顺便说一下,GtkWindow上的GTK_widget_destroy应该可以工作,因为GtkWindow是从GtkWidget派生的。请给我们看一些代码。这是关闭按钮的父窗口。所以我想用按钮关闭第二个窗口。。。不是主要的…那么gtk_widget_destroy才是出路。请给我们一些代码,这很有效!但是代码有一些bug。最后的代码进入初始问题。谢谢很抱歉代码质量太差,匆忙编写了更改:-/。我根据您的测试进行了修复,因此最终答案也出现在这里。你也应该试试只有林间空地的方法。只有在有多个参数要传递时(例如,在一个结构中),您才会受到限制,但在像这样的简单情况下,它应该可以很好地工作。
void open_window(GtkWidget *widget, gpointer window)
{
GtkBuilder *builder;
GtkWidget *secondWindow = NULL;
GtkWidget *closeButton = NULL;
builder = gtk_builder_new ();
gtk_builder_add_from_file (builder, "secondWindow.glade", NULL);
secondWindow = GTK_WIDGET (gtk_builder_get_object (builder, "secondWindow"));
closeButton = GTK_WIDGET (gtk_builder_get_object (builder, "closeWindowButton"));
g_signal_connect (G_OBJECT (closeButton),
"clicked",
G_CALLBACK (close_window),
G_OBJECT (secondWindow)); // here is the magic: the callback will get the window to close
g_object_unref (G_OBJECT (builder));
gtk_window_set_modal(GTK_WINDOW(secondWindow), TRUE);
gtk_widget_show_all(secondWindow);
}