2011-10-24 37 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