2012-01-28 108 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