其他分享
首页 > 其他分享> > c – glade文件中的gtkmm构建器不起作用

c – glade文件中的gtkmm构建器不起作用

作者:互联网

我的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()行)

解决方法:

添加以下行作为main中的第一行:

Gtk::Main kit(argc, argv);

根据Gtkmm Hello World tutorial

First we instantiate an object called kit. This is of type Gtk::Main. Every gtkmm program must have one of these.

这个对象负责初始化所有GTK库,包括调用你的错误所讨论的g_type_init函数.

当然,您可以使用任何您喜欢的名称而不是套件.

更新:哦,你应该打电话给:

Gtk::Main::run();

或等效地:

kit.run();

正如Erandros在评论中所说的那样.没有它,程序将完成immediatley.它将发出一个将运行主循环的gtk_main()调用.

标签:gtkmm,glade,c
来源: https://codeday.me/bug/20190902/1793733.html