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