在Gtkmm中打开多个不同的窗口

时间:2018-05-27 20:17:27

标签: c++ gtkmm gtkmm3

我刚刚开始学习如何使用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,然后关闭它时会出现段错误。

现在忘记了段错误(我对此完全感到困惑),我想我可以看到它为什么只打开servsettings - 我认为这是因为我正在运行应用程序,然后只有那个调用当窗户死亡时退出?

问题是,我想不出任何其他方式去做。我尝试过多线程,但我决定先在这里问一下。

在有人建议之前,this回答对我没有帮助。这是因为他们有一个基于范围的问题。我没有。

2 个答案:

答案 0 :(得分:0)

我找到了答案。对于那些想知道的人,我用以下内容替换了两个app->run

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

答案 1 :(得分:0)

使用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);
}