只允許一個Gtk :: Main對象。應該在運行主事件循環的同一線程中創建小部件。要解決此限制,您需要開發一種方法將窗口創建命令傳遞給gtk線程。
最簡單的方法是使用油嘴::調度
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();
油嘴:: Dispatcher不會採取任何論點,所以下一步是找出如何在線程之間傳遞參數。
對於不同類型的窗口,您可以使用不同的顯示器。
boost :: asio :: io_service可以幫助你傳遞消息。
while(!exit) {
io_service.reset();
io_service.poll();
while(Gtk::Main::events_pending())
Gtk::Main::iteration();
Sleep(0);
}
當您創建頂層窗口(這是默認的窗口類型)時,不會將其自身附加到主事件循環嗎? – Ivarpoiss
它只是在調用啓動事件循環的Main :: run方法之前創建的。我問在循環開始後是否有附加窗口的方法。 – Paranaix
您可以在Main ::以相同方式(在事件循環中)運行後添加窗口。沒有任何窗口開始事件循環沒有意義。如果你真的想這樣做,Main :: iteration。手動設置循環。 – Ivarpoiss