2012-01-28 106 views
1

我有一個非常用的gtk對話框。此對話框位於單獨的代碼文件中,並具有用於UI的單獨glade文件。這是因爲我想讓這個對話框「可替換」,以用於不同的項目。作業對話框被銷燬後,每次需要時再次加載。 但這裏有模態問題。Gtk,模態對話框

這是我如何調用對話框:

int dlgresult; 
    dlgresult = main_art(GTK_WIDGET(window), get_sif()); 

這是有趣的對話:

int main_art(GtkWidget *caller, int artSif) 
{ 
GtkDialog *dlg_art; 
char *xmlFile = "art.glade"; 
builder = gtk_builder_new(); 
gtk_builder_add_from_file(builder, xmlFile, NULL); 
dlg_artikl = GTK_DIALOG(gtk_builder_get_object(builder, "dlg_art")); 
... other widgets... 

gtk_builder_connect_signals(builder, NULL); 
g_object_unref(G_OBJECT(builder)); 

gtk_window_set_modal(GTK_WINDOW(GTK_DIALOG(dlg_art)), TRUE); 
gtk_window_set_transient_for(GTK_WINDOW(GTK_DIALOG(dlg_art)), GTK_WINDOW(GTK_WIDGET(caller))); 

//placing dialog window relative to parent window 
int x, y; 
gdk_window_get_origin(GDK_WINDOW(GTK_WIDGET(caller)->window), &x, &y); 
gtk_window_move(GTK_WINDOW(dlg_artikl), x+8, y); 
// 
int dlgresponse; 
dlgresponse = gtk_dialog_run(GTK_DIALOG(dlg_art)); 
if (dlgresponse == 1) 
{ 
    //Save changes 
} 
gtk_widget_destroy(GTK_WIDGET(dlg_art)); 
return dlgresponse; 
} 

當彈出對話框我還可以選擇在主窗口中任何東西,甚至推出新的對話框,幾次。這意味着我的對話不適合我的主要應用。

這可以以圖示的方式完成嗎? 什麼是不正確的,我的想法或我的代碼?

程序編譯良好,執行時終端沒有錯誤。

回答

1

在GTK2/GNOME2我使用類似下面的代碼來創建一個非模態對話框:

static void display_nonmodaldialog(GtkWidget *dialog, char *t) 
{ 
    if(dialog!=NULL) 
    { 
    gtk_widget_hide(dialog); 
    gtk_widget_destroy(dialog); 
    } 

    dialog=gtk_message_dialog_new(NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "%s", t); 
    if(dialog) 
    { 
    g_signal_connect_swapped(dialog, "response", G_CALLBACK (gtk_widget_destroy), dialog); 
    gtk_widget_show_all(dialog); 
    } 
} 

爲了顯示一個模式對話框你的東西,如更換gtk_message_dialog_new行:

dialog=gtk_message_dialog_new(NULL, GGTK_DIALOG_MODAL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "%s", t); 

另請參閱:http://developer.gnome.org/gtk/2.24/GtkDialog.html#GtkDialogFlags

用於影響對話框構建的標誌。

GTK_DIALOG_MODAL 構建對話框模態,請參見gtk_window_set_modal()。

GTK_DIALOG_DESTROY_WITH_PARENT 銷燬父對象被銷燬時的對話框,請參閱gtk_window_set_destroy_with_parent()。

+0

我還爲messageboxex等使用了這樣的「經典」對話框。但請注意,這裏是不同的情況。整個對話框在其他文件中,甚至在主文件中沒有引用。但應該阻止主窗口。兩者共享相同的「main_loop」。 – 2012-01-28 07:43:11

1

花費約2小時,試圖讓同樣的事情,下班後我找到了模態窗口一些基本規則在GTK +:

  1. 的「瞬時」應設置的模式了。
  2. 兩個都應該在顯示窗口後設置。
+0

這絕對應該是被接受的答案 – orenk86 2014-12-18 07:58:01