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

时间:2017-10-02 05:34:46

标签: c++ gtk gtk3 glade

我使用Glade制作GUI。我做了一个主窗口和一个对话框。从主窗口中的按钮调用该对话框。问题是,当我关闭(删除事件)对话框时,无法再次使用主窗口单击按钮再次调用它。我可以使用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;
}

1 个答案:

答案 0 :(得分:1)

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

你想要的是从GtkWidget继承的destroy信号。

只是不要连接到delete-event,因为调用destroy是默认行为,或者从delete-event返回FALSE,因此结束事件会传播并点击destroy。< / p>