2014-09-04 90 views
0

我正在編程我的第一個更大的GTK +應用程序,並且在退出應用程序時遇到了一些麻煩。 我想在對話框中有一個Quit-Button,因爲通常你應該以全屏模式運行程序。GTK應用程序不會退出對話框

首先,我試圖從信號中直接調用「gtk_main_quit」,但它也沒有工作。現在我通過一個事件嘗試了它,控制檯輸出工作正常,但「gtk_main_quit」沒有做任何事情!

有人可以解釋我做錯了什麼嗎?如果你想給我一些更好的編碼技巧,我也會非常歡迎!

感謝您提前幫忙!

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

static gboolean gtk_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) 
{ 
    g_message("delete event occured\n"); 

    gtk_main_quit(); 
    return TRUE; 
} 

static void check_toggle_fullscreen (GtkToggleButton *checkButton_fullscreen, GtkWindow *window) 
{ 
    if (gtk_toggle_button_get_active(checkButton_fullscreen)) 
    { 
     gtk_window_fullscreen(GTK_WINDOW(window)); 
    } 
    else 
    { 
     gtk_window_unfullscreen(GTK_WINDOW(window)); 
    } 
} 


static gboolean double_clicked (GtkWidget *eventbox, GdkEventButton *event, GtkWindow *window) 
{ 

    GtkWidget *dialog, *hbox, *checkButton_fullscreen, *image, *button_preferences, *button_closeApp; 

    dialog = gtk_dialog_new_with_buttons("Schnelleinstellung", window, GTK_DIALOG_MODAL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); 

    checkButton_fullscreen = gtk_check_button_new_with_label("Fullscreen"); 
    image = gtk_image_new_from_stock(GTK_STOCK_FULLSCREEN, GTK_ICON_SIZE_BUTTON); 

    hbox = gtk_hbox_new(FALSE, 10); 
    gtk_box_pack_start_defaults (GTK_BOX(hbox), image); 
    gtk_box_pack_start_defaults (GTK_BOX(hbox), checkButton_fullscreen); 

    if (gdk_window_get_state(gtk_widget_get_window(GTK_WIDGET(window))) & GDK_WINDOW_STATE_FULLSCREEN) 
    { 
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkButton_fullscreen), TRUE); 
    } 




    button_closeApp = gtk_button_new_from_stock(GTK_STOCK_QUIT); 
    button_preferences = gtk_button_new_from_stock(GTK_STOCK_PREFERENCES); 

    //Fill dialog with content 
    gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox); 
    gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox), button_preferences); 
    gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox), button_closeApp); 


    g_signal_connect(G_OBJECT(checkButton_fullscreen), "toggled", G_CALLBACK(check_toggle_fullscreen), (gpointer)window); 
    g_signal_connect(G_OBJECT(button_closeApp), "clicked", G_CALLBACK(gtk_delete_event), NULL); 



    if (event-> type == GDK_2BUTTON_PRESS) 
    { 
     gtk_widget_show_all(dialog); 

     gtk_dialog_run(GTK_DIALOG(dialog)); 
     gtk_widget_destroy(dialog); 
    } 



    return FALSE; 
} 


int main (int argc, char *argv[]) 
{ 

    GtkWidget *window; 
    GtkWidget *vbox; 
    GtkWidget *vbox2; 
    GtkWidget *label[5]; 
    GtkWidget *frame1, *frame2; 
    GtkWidget *eventbox; 
    PangoFontDescription *font; 

    gtk_init(&argc, &argv); 


     //Window_TOPLEVEL 
     window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 

     gtk_window_set_title(GTK_WINDOW(window),"Abnahme"); 
     gtk_window_maximize(GTK_WINDOW(window)); 
     gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_NONE); 

     gtk_window_set_decorated(GTK_WINDOW(window), TRUE); 


      vbox = gtk_vbox_new(FALSE, 10); 
      vbox2 = gtk_vbox_new(FALSE, 10); 
      frame1 = gtk_frame_new("Naechster Skid"); 
      frame2 = gtk_frame_new("Warteschlange"); 
      eventbox = gtk_event_box_new(); 

      gtk_frame_set_shadow_type(GTK_FRAME(frame1), GTK_SHADOW_IN); 
      gtk_frame_set_shadow_type(GTK_FRAME(frame2), GTK_SHADOW_IN); 




      label[0] = gtk_label_new("1"); 
      font = pango_font_description_from_string("Arial 40"); 
      gtk_widget_modify_font(label[0], font); 

      gtk_label_set_markup(GTK_LABEL(label[0]), "<b>Erster Skid</b>"); 


      int j = 1; 
      while(j<5) 
      { 
       gchar buffer[10]; 
       label[j] = gtk_label_new("0"); 
       g_snprintf(buffer, sizeof(buffer), "%i",j+1); 
       gtk_label_set_markup(GTK_LABEL(label[j]), buffer); 
       gtk_widget_modify_font(label[j], font); 
       j++; 
      } 


      //Level 0 
      gtk_container_add(GTK_CONTAINER(window), eventbox); 
      gtk_event_box_set_above_child(GTK_EVENT_BOX(eventbox), TRUE); 
      gtk_container_add(GTK_CONTAINER(eventbox), vbox); 
       //Level 1 
       gtk_box_pack_start(GTK_BOX(vbox),frame1, TRUE, TRUE, 0); 
        //Level 2 
        gtk_container_add(GTK_CONTAINER(frame1), label[0]); 

       //Level 1 
       gtk_box_pack_start(GTK_BOX(vbox),frame2, TRUE, TRUE, 0); 
        //Level 2 
        gtk_container_add(GTK_CONTAINER(frame2), vbox2); 
         //Level 3 

         int i = 1; 
         while(i<5) 
         { 
          gtk_box_pack_start(GTK_BOX(vbox2), label[i], TRUE, TRUE, 0); 
          i++; 
         } 


      //Signals 
      g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_delete_event), NULL); 
      g_signal_connect(G_OBJECT(eventbox), "button_press_event", G_CALLBACK(double_clicked), (gpointer) window); 

      gtk_widget_set_events(eventbox, GDK_BUTTON_PRESS_MASK); 
      gtk_widget_realize(eventbox); 



    /* Enter the main loop */ 
    gtk_widget_show_all (window); 
    gtk_main(); 


    return 0; 
} 

回答

0

刪除gtk_dialog_run()和gtk_widget_destroy()之類的代碼可用於退出對話框按鈕。

if (event-> type == GDK_2BUTTON_PRESS) 
{ 
    gtk_widget_show_all(dialog); 

    /* 
    * gtk_dialog_run(GTK_DIALOG(dialog)); 
    * gtk_widget_destroy(dialog); 
    */ 
} 

看來,原因是運行對話框阻止退出應用程序。

+0

謝謝,那個工程,但現在我不明白使用「gtk_dialog_run」Oo – Rusticus 2014-09-05 08:58:59

+0

我不'也知道,我們可能應該閱讀API的源代碼... – Wataru 2014-09-05 09:50:39

1

gtk_dialog_run()進入遞歸主循環。 gtk_main_quit()只退出主循環的最內層遞歸。

我不知道GTK +是否提供了一種乾淨的方式來做你想做的事情;你可能不得不自己做那件事。

+0

謝謝,我不知道,也沒有在我的書「GTK +開發的基礎」中讀到 – Rusticus 2014-09-05 08:57:24