Откройте несколько разных окон в Gtkmm - PullRequest
0 голосов
/ 27 мая 2018

Я только начал изучать, как использовать gtkmm, и я пытаюсь создать приложение, в котором одновременно может быть открыто более одного окна (например, главное окно и панель управления).

Я решил создать макет в Glade, если это имеет какое-либо отношение к этому вопросу.

Мой метод отображения двух бутылок более или менее такой:

Gtk::Window* main_window = nullptr;
Gtk::Window* servsettings = nullptr;

int main(int argc, char* argv[]) {
    auto app = ...
    auto builder = ... // these are exluded for brevity

    builder->add_from_file("../src/design.glade");

    builder->get_widget("main", main_window);
    builder->get_widget("servsettings", servsettings);

    app->run(*servsettings);
    app->run(*main_window);
}

Вместооткрывая два окна, вместо этого открывается servsettings, а затем при закрытии этого происходит ошибка segfaults.

Теперь, забыв о segfault (я в этом совершенно запутался), я думаю, я понимаю, почему он открывается только servsettings - Я предполагаю, что это потому, что я запускаю приложение, и тогда этот вызов завершается только тогда, когда окно умирает?

Проблема в том, что я не могу придумать другой способ сделать это.Я экспериментировал с многопоточностью, но решил, что лучше сначала спросить здесь.

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

Ответы [ 2 ]

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

Использование Gtk :: Application :: add_window (Gtk :: Window &) .

Если все окна, управляемые Gtk :: Application, закрыты (скрыты) или удаленызатем из приложения вернется вызов run ().

#include <gtkmm.h>

Gtk::Window* window1, *window2;

int main()
{
    auto app = Gtk::Application::create();
    Gtk::Button button1("Quit"), button2("Quit");
    window1 = new Gtk::Window();
    window2 = new Gtk::Window();
    button1.signal_clicked().connect(sigc::mem_fun(window1, &Gtk::Window::close));
    button2.signal_clicked().connect(sigc::mem_fun(window2, &Gtk::Window::close));

    window1->set_default_size(200, 200);
    window1->add(button1);
    window1->show_all();

    window2->set_default_size(200, 200);
    window2->add(button2);
    window2->show_all();

    app->signal_startup().connect([&]{
            app->add_window(*window2);
            });
    return app->run(*window1);
}
0 голосов
/ 27 мая 2018

Я нашел ответ.Для тех, кто интересуется, я заменил два app->run с:

servsettings->show();
main_window->show();
app->run(*main_window);
...