gtkmm: модальные виджеты в окне - PullRequest
0 голосов
/ 07 сентября 2011

У меня следующая проблема: я создал программу, которая запрашивает у пользователя ввод данных.Это делается с использованием производного Gtk::Dialog, которое используется следующим образом:

if (modal_dialog->run() == SUCCESS){
  // do stuff depending on modal_dialog inputs here
}

Теперь я хотел бы заменить диалог встроенным виджетом, который отображается в моем главном окне, но действует так же, как моймодальный диалог.Это означает, что я хотел бы иметь возможность вызывать что-то вроде:

if (modal_widget->run == SUCSESS){
  // hide modal widget and do stuff
}

Это легко возможно в C ++ / gtkmm?

Примечание: Мне удалось получитьжелаемое поведение (то же самое для конечного пользователя) с использованием переменных состояния и т. д. Это означает, что я вручную show виджет wannabe-modal и говорю кнопке подтверждения в виджете wannabe-modal выполнить остальную частьрутина (совокупность вышеприведенных if -общений).Тем не менее, я использую один и тот же виджет-подражатель для разных действий, так что я всегда должен следить за тем, что я делаю, что не очень элегантно.

1 Ответ

2 голосов
/ 07 сентября 2011

Вместо вызова run() Вы можете создать объект локального цикла и сделать вложенный цикл. Я не очень хорошо знаю gtkmm, но код gtk + будет:

GMainLoop *loop = g_main_loop_new(NULL, FALSE);
g_main_loop_run(loop);
g_main_loop_unref(loop);

Теперь, в событии clicked ваших кнопок Ok / Cancel просто вызовите g_main_loop_quit(loop) и вложенный цикл прервется.

На самом деле это более или менее то, что делает функция gtk_dialog_run.

Но будьте осторожны! Ваш виджет run() блокирует, но не является модальным, и это опасный зверь: любой другой виджет в приложении по-прежнему будет нести ответственность перед пользователем Вы должны избегать любого нежелательного повторного входа.

...