因为我正在编写一个在面对其他配置时表现完全不同的“通用”应用程序,所以即使我在启动时还不知道它们,我也被迫显示 gtk 窗口。可能还需要多个窗口需要同时可见(不是模态对话框,而是独立窗口)。但是,如果可以在启动时简单地启动一个 gtk 事件循环,那就太好了。
是否可以在启动后以某种方式将窗口添加到该循环?虽然我发现Gtk::Application
该类似乎完全支持缩进行为,但我被限制使用Gtk::Main
该类。
因为我正在编写一个在面对其他配置时表现完全不同的“通用”应用程序,所以即使我在启动时还不知道它们,我也被迫显示 gtk 窗口。可能还需要多个窗口需要同时可见(不是模态对话框,而是独立窗口)。但是,如果可以在启动时简单地启动一个 gtk 事件循环,那就太好了。
是否可以在启动后以某种方式将窗口添加到该循环?虽然我发现Gtk::Application
该类似乎完全支持缩进行为,但我被限制使用Gtk::Main
该类。
只允许一个 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);
}