如何正确关闭在 Glade 中创建的对话框?

How to properly close a dialog made in Glade?

我用Glade做GUI。我做了一个主要 window 和一个对话框。该对话框是从位于主 window 中的按钮调用的。问题是,当我关闭(删除事件)对话框时,无法通过单击主 window 的相同按钮再次调用它。我可以用 gtk_widget_hide_on_delete 隐藏对话框,但这个选项不是我需要的。我需要关闭对话框并释放它占用的内存。

那么销毁对话框并通过单击同一按钮再次调用它的正确方法是什么?

我用c++实现的方式:

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

GtkBuilder     *gtkBuilder;
GtkWidget      *main_window;
GtkWidget      *grid_dialog;
GtkToolButton  *grid_toolbutton;

void grid_any_clicked(GtkWidget *widget,
                      gpointer   user_data)
{
    GtkWidget *window = (GtkWidget *) user_data;
    gtk_widget_show_all(window);
}

int main(int argc, char *argv[])
{
  gtk_init(&argc, &argv);
  gtkBuilder = gtk_builder_new();

  // GUI
  gtk_builder_add_from_file(gtkBuilder, "../GUI.glade", NULL);

  // Widgets
  main_window = GTK_WIDGET(gtk_builder_get_object(gtkBuilder, "main_window"));
  grid_dialog = GTK_WIDGET(gtk_builder_get_object(gtkBuilder, "grid_dialog"));
  grid_toolbutton = GTK_TOOL_BUTTON(gtk_builder_get_object(gtkBuilder, "grid_toolbutton"));

  // Events
  g_signal_connect(grid_toolbutton, "clicked", G_CALLBACK(grid_any_clicked), grid_dialog);
  gtk_builder_connect_signals(gtkBuilder, NULL);

  // Finalizing
  g_object_unref(G_OBJECT(gtkBuilder));
  gtk_widget_show_all(main_window);
  gtk_main();
  return 0;
}

delete-event 适用于当您想要拦截用户单击 window 关闭按钮这一事实,并且您想要对此操作做出反应时。想想那些在关闭编辑器之前询问您是否要保存未保存更改的文档的编辑器。

你要的是destroy信号,继承自GtkWidget。

只是不要连接到 delete-event,因为调用 destroy 是默认行为,或者从 delete-event 调用 return FALSE 以便关闭事件传播并命中 destroy.