2011-10-24 39 views
1

我的gtkmm程序不會顯示任何窗口。編譯工作正常。這些都是在運行時,我得到消息:從glade文件gtkmm生成器不起作用

(process:2312): GLib-GObject-CRITICAL **: /build/buildd/glib2.0-2.24.1/gobject  
/gtype.c:2706: You forgot to call g_type_init() 
(process:2312): GLib-CRITICAL **: g_once_init_leave: assertion 
`initialization_value != 0' failed 
(process:2312): GLib-GObject-CRITICAL **: g_object_newv: assertion 
`G_TYPE_IS_OBJECT (object_type)' failed 

代碼是:

int main(int argc, char** argv) { 
    Glib::RefPtr<Gtk::Builder> builder = 
     Gtk::Builder::create_from_file("basic.glade"); 
    Gtk::Window* pMyWindow = 0; 
    builder->get_widget("window1", pMyWindow); 
    pMyWindow->show(); 
} 

如果basic.glade是一個有效的文件或不存在沒關係。我嘗試了整個路徑文件而不是basic.glade。
當我調試它時,我意識到程序永遠不會從構建器的第一行中跳出來。這就像它一直在運行,所以當我暫停唯一的過程時,要麼是g_once_init_enter_impl()要麼是g_slist_find()(被前者調用)。 所以我從來沒有看到任何窗口(因爲它從來沒有得到到pMyWindow->show()線)

+0

快速的問題,你必須摧毀(釋放內存)的窗口在主要? – Matthew

回答

3

添加以下行作爲第一行main

Gtk::Main kit(argc, argv); 

按照Gtkmm Hello World tutorial

首先我們實例化一個名爲kit的對象。這是類型Gtk :: Main。每個gtkmm程序都必須具有其中的一個。

此對象負責初始化所有GTK +庫,包括調用您的錯誤討論的g_type_init函數。

當然,你可以使用任何你喜歡的名字而不是kit

UPDATE:哦,你應該打個電話:

Gtk::Main::run(); 

或等價:

kit.run(); 

由Erandros在評論親切指出。沒有它,程序將立即完成。它將發出一個gtk_main()調用,它將運行主循環。

+0

爲了運行GUI,請添加'kit.run()',因此我將其標記爲正確。 – Erandros