我有一个不常用的gtk对话框。此对话框位于单独的代码文件中,并具有用于UI的单独glade文件。这是因为我想让这个对话框“可替换”,以便在不同的项目中使用。工作对话框被销毁后,每次需要再次加载。 但这里有形态问题。
这就是我调用对话框的方式:
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;
}
当弹出对话框时,我仍然可以在主窗口上选择任何内容,甚至可以启动新对话框几次。这意味着我的对话框不是我主要应用的模态。
这可以用图示方式完成吗? 什么是不正确的,我的想法或我的代码?
程序编译得很好,执行时终端没有错误。
答案 0 :(得分: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()。
答案 1 :(得分:1)
在花了大约2个小时尝试使同样的事情发挥作用后,我在GTK +中找到了一些模态窗口的基本规则: