Gtk, модальный диалог - PullRequest
       3

Gtk, модальный диалог

1 голос
/ 28 января 2012

У меня есть одно необычное использование диалога GTK.Это диалоговое окно находится в отдельном файле кода и имеет отдельный файл 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 ]

1 голос
/ 17 декабря 2014

Потратив около 2 часов, пытаясь заставить ту же самую вещь работать, я нашел некоторые основные правила для модальных окон в GTK +:

  1. «Переходный процесс» должен быть установлен ДО модальности.
  2. Оба должны быть установлены после показа окна.
1 голос
/ 28 января 2012

В 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 ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...