我的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
Run Code Online (Sandbox Code Playgroud)
代码是:
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();
}
Run Code Online (Sandbox Code Playgroud)
如果basic.glade是有效文件或不存在则无关紧要.我尝试使用整个路径文件而不是basic.glade.
当我调试它时,我意识到该程序永远不会脱离该构建器的第一行.它就像它一直在运行,所以当我暂停唯一的过程时,要么处于g_once_init_enter_impl()或处于g_slist_find()(由前者调用).所以我没有看到任何窗口(因为它永远不会到达那条pMyWindow->show()线)
添加以下行作为第一行main:
Gtk::Main kit(argc, argv);
Run Code Online (Sandbox Code Playgroud)
首先,我们实例化一个名为kit的对象.这是Gtk :: Main类型.每个gtkmm程序都必须具有其中一个.
这个对象负责初始化所有GTK +库,包括调用g_type_init你的错误所讨论的 函数.
当然,您可以使用您喜欢的任何名称而不是kit.
更新:哦,你应该打电话给:
Gtk::Main::run();
Run Code Online (Sandbox Code Playgroud)
或等效地:
kit.run();
Run Code Online (Sandbox Code Playgroud)
正如Erandros在评论中所说的那样.没有它,程序将完成immediatley.它将发出一个gtk_main()将运行主循环的调用.