Gtkmm:稍后添加窗口

Gtkmm: Adding Window at later time

本文关键字:添加 窗口 Gtkmm      更新时间:2023-10-16

因为我正在编写一个"通用"应用程序,在面对其他配置时行为完全不同,所以我被迫显示 gtk 窗口,即使我在启动时还不知道它们。可能还需要同时需要多个窗口(不是模式对话框,而是独立窗口)。但是,如果可以在启动时简单地启动一个 gtk 事件循环,那就太好了。

是否可以在启动后以某种方式将窗口添加到该循环中?虽然我找到了似乎完全支持缩进行为的Gtk::Application类,但我只能使用 Gtk::Main 类。

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

最简单的方法是使用 Glib::D ispatcher

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::D ispatcher 不接受任何参数,所以下一步是弄清楚如何在线程之间传递参数。

对于不同类型的窗口,您可以只使用不同的分配器。

boost::

asio::io_service 可以帮助您传递消息。

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