Gtkmm:稍后添加窗口

时间:2012-06-04 17:37:49

标签: c++ window gtkmm event-loop

因为我在写一个“通用”应用程序时面对其他配置时表现完全不同,即使我在启动时还没有知道它们,我也不得不显示gtk窗口。可能还需要同时可以看到多个窗口(不是模态对话框而是独立窗口)。但是,如果一个人可以在启动时简单地启动一个gtk事件循环,那就太好了。

以某种方式可以在启动后向该循环添加窗口吗? 虽然我发现Gtk::Application类似乎完全支持缩进行为,但我限制使用Gtk::Main类。

1 个答案:

答案 0 :(得分:1)

只允许使用一个Gtk :: Main对象。小部件应该在运行主事件循环的同一个线程中创建。要解决此限制,您需要开发一种方法将窗口创建命令传递给gtk线程。

最简单的方法是使用Glib :: Dispatcher

struct WindowBuilder {
    /**/
    Glib::Dispatcher* signal_create;

    void create_window() {
        //From main thread...
        signal_create->emit();
    }
}

void create_mainWnd() {
    new Ui::MainWnd();
}

//From Gtk thread...
builder->signal_create->connect(sigc::ptr_fun(create_mainWnd));

Gtk::Main::run();

Glib :: Dispatcher不带任何参数,因此下一步是弄清楚如何在线程之间传递参数。

对于不同类型的窗户,您可以使用不同的扫描仪。

boost :: asio :: io_service可以帮助你传递信息。

while(!exit) {
    io_service.reset();
    io_service.poll();
    while(Gtk::Main::events_pending())
        Gtk::Main::iteration();
    Sleep(0);
}