2012-06-04 95 views
0

由於我正在寫一個面向其他配置時表現完全不同的「通用」應用程序,即使我在啓動時還不知道它們,我也不得不顯示gtk窗口。還可能需要多個窗口同時可以訪問(不是模態對話框,而是獨立窗口)。但是,如果在啓動時可以簡單地啓動一個gtk事件循環,那將會很棒。Gtkmm:稍後添加窗口

是否有可能在啓動後將窗口添加到該循環? 儘管我發現類似Gtk::Application的類似於支持精確縮進行爲,但我僅限於使用Gtk::Main類。

+0

當您創建頂層窗口(這是默認的窗口類型)時,不會將其自身附加到主事件循環嗎? – Ivarpoiss

+0

它只是在調用啓動事件循環的Main :: run方法之前創建的。我問在循環開始後是否有附加窗口的方法。 – Paranaix

+0

您可以在Main ::以相同方式(在事件循環中)運行後添加窗口。沒有任何窗口開始事件循環沒有意義。如果你真的想這樣做,Main :: iteration。手動設置循環。 – Ivarpoiss

回答

1

只允許一個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); 
}