Gtkmm - правильный способ закрыть окно, а затем показать другое - PullRequest
0 голосов
/ 12 июня 2018

Я создаю приложение gtkmm.Программа открывается с окном настроек, в котором пользователю предлагается указать некоторую информацию, и когда проверки работоспособности завершены, это окно должно быть закрыто, а главное окно приложения должно открыться.

Прямо сейчас, открыв основнойОкно, и скрывая окно настроек полностью закройте приложение.Из настроек окна я делаю:

MainWindow* main_window = new MainWindow();
main_window->show();                       
this->hide();                              

Как я могу получить поведение, описанное выше?Видимо, вы можете добавлять и удалять окна из Gtk::App.Будет ли это делать то, что я описал, и означает ли это, что мне придется передать моему окну указатель Gtk::App?Спасибо.

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

В ответ на ваш ответ: delete->this - это чисто синтаксическая ошибка, и даже без -> написание delete this обычно является запахом кода.За исключением этого, то, что вы сделали, похоже, сработает, если, возможно, не будет настолько интуитивно понятным, как могло бы быть.

Однако выполнение действий в такой последовательности не всегда возможно.Например, вы можете не знать, что будет следующим Window.Возможно, какое окно откроется следующим, зависит от ответа HTTP, который может занять некоторое время.

Общее решение состоит в том, чтобы вызвать Application.hold() перед удалением Window.Вызов .hold() увеличивает счетчик использования GApplication, так же как и при добавлении окна.Приложение закрывается, когда его счетчик использования равен нулю.Сказать, что его жизнь контролируется окнами, - это просто быстрый способ приблизительного объяснения этого (и, очевидно, имеет отношение только к GtkApplication, а не к основанию GApplication).Удаление окна уменьшает счетчик использования.

Итак, в этом случае вы теперь перейдете с счетчика использования от 2 до 1, а не от 1 до 0, поэтому удаление 1-го окна больше не приведет к закрытию приложения.,Затем, после того как вы добавите 2-е окно, как бы много позже это ни происходило, вызовите .release(), чтобы удалить счетчик дополнительного использования, чтобы оставшиеся окна теперь снова полностью контролировали время жизни приложения.

0 голосов
/ 12 июня 2018

То, что кажется правильным решением - это передать в окно указатель приложения (m_app), добавить в него новое окно, показать это окно и скрыть текущее.Удаление текущего из приложения позволит функции run () вернуть:

MainWindow* main_window = new MainWindow(m_app);
m_app->add_window(*main_window);                
main_window->show();                            
this->hide();                                   
m_app->remove_window(*this);                    
delete->this;

Это работает, но это может быть неправильный способ действий.

...