Gtk,模态对话框

时间:2012-01-28 00:30:28

标签: c gtk

我有一个不常用的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;
}

当弹出对话框时,我仍然可以在主窗口上选择任何内容,甚至可以启动新对话框几次。这意味着我的对话框不是我主要应用的模态。

这可以用图示方式完成吗? 什么是不正确的,我的想法或我的代码?

程序编译得很好,执行时终端没有错误。

2 个答案:

答案 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 +中找到了一些模态窗口的基本规则:

  1. "瞬态"应该在模态之前设置。
  2. 两个都应该在窗口显示后设置。