我有一个简单的Glade文件包含在C源代码中。下面是有趣的部分:GtkBuilder没有实现小部件?
int main(int argc, char *argv[]) {
GtkBuilder *builder;
gtk_init(&argc, &argv);
gdk_gl_init(&argc, &argv);
// ... some OpenGL specific initializations
builder = gtk_builder_new();
gtk_builder_add_from_file(builder, "gui.ui", NULL);
gtk_builder_connect_signals(builder, NULL);
window = GTK_WIDGET(gtk_builder_get_object(builder, "main_window"));
drawingArea = GTK_wIDGET(gtk_builder_get_object(builder, "drawing_area"));
gtk_container_set_reallocate_redraws(GTK_CONTAINER(window), TRUE);
gtk_widget_set_gl_capability(drawingArea, glConfig, NULL, TRUE, GDK_GL_RGBA_TYPE);
// ...
}
如果我编译此,我得到这样的警告:
gtk_widget_set_gl_capability: assertion `!gtk_widget_get_realized (widget)' failed
如果我现在使用的,而不是与此代码GtkBuilder libglade的(我保存的林间空地文件是兼容Libglade):
int main(int argc, char *argv[]) {
GladeXML *xml;
gtk_init(&argc, &argv);
gdk_gl_init(&argc, &argv);
// ... some OpenGL specific initializations
xml = glade_xml_new("gui.glade", NULL, NULL);
glade_xml_signal_autoconnect(xml);
window = glade_xml_get_widget(xml, "main_window");
drawingArea = glade_xml_get_widget(xml, "drawing_area");
gtk_container_set_reallocate_redraws(GTK_CONTAINER(window), TRUE);
gtk_widget_set_gl_capability(drawingArea, glConfig, NULL, TRUE, GDK_GL_RGBA_TYPE);
// ...
}
所有工作正常,没有错误出现。我已经尝试了几件事情来强制在GtkBuilder版本中实现drawing_area,但没有任何工作。我在这里忘了一些魔术吗?
你为什么不尝试绑定到实现信号?只要在那里做所有的opengl启动东西。这比强迫窗口实现要好得多。 – Lalaland
您正在阅读错误错误,问题是小部件已经实现。就像一个黑客(不要使用它作为一个修复)尝试在'gtk_widget_set_gl_capability'之前添加这两行:'if(gtk_widget_get_realized(drawingArea))gtk_widget_unrealize(drawingArea);'如果它有效,那么从那里寻找修复。你正在实现沿线的'drawingArea'。 AFAIK UI定义没有实现任何对象 –
'GTK_wIDGET'?我猜这是行不通的:) –