2017-10-02 21 views
0

Glade를 사용하여 GUI를 만듭니다. 나는 메인 창과 대화를했다. 이 대화 상자는 기본 창에있는 버튼에서 호출됩니다. 문제는 대화 상자를 닫을 때 (삭제 이벤트) 대화 상자를 클릭 할 때 주 창과 동일한 단추를 클릭하여 다시 호출 할 수 없다는 것입니다. gtk_widget_hide_on_delete으로 대화 상자를 숨길 수 있지만이 옵션은 내가 원하는 것이 아닙니다. 대화 상자를 닫고 필요한 메모리를 확보해야합니다.Glade에서 만든 대화 상자를 올바르게 종료하는 방법은 무엇입니까?

그럼 대화 상자를 파괴하고 같은 버튼을 클릭하여 다시 호출하는 적절한 방법은 무엇입니까?

나 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

delete-event을 사용하면 사용자가 윈도우 닫기 버튼을 클릭 사실을 차단하고자 할 때입니다, 당신은이 작업에 반응합니다. 편집자를 닫기 전에 저장하지 않은 변경 사항이있는 문서를 저장할지 묻는 편집자를 생각해보십시오.

원하는 것은 GtkWidget에서 상속 한 destroy 신호입니다.

destroy이 기본 동작이므로 delete-event에서 FALSE를 반환하므로 닫는 이벤트가 전파되어 destroy에 도달하므로 그냥 delete-event에 연결하면 안됩니다.