我在C源代码中包含一个简单的Glade文件。以下是有趣的部分:
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
如果现在我通过此代码使用LibGlade代替GtkBuilder(我保存了Glade文件以与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,但没有任何效果。我在这里忘了一些魔术吗?
最佳答案
将顶部窗口的“可见”属性设置为False
。
在过去的几周中,我遇到了完全相同的问题。我从glade2转换为使用gtkglext的glade3的glade xml文件只是不接受gtk_widget_set_gl_capability调用。在阅读了这篇文章并对功能文件进行了比较(感谢Jose Commins)之后,我才意识到顶部窗口的visible属性被设置为True。将其更改为False,一切正常。由于旧的glade2文件中的所有顶部窗口均设置为“ True”,因此该默认窗口必须为默认值。较新的软件将其设置为False。与等待直到显式调用create函数的旧C代码实践相反,Builder必须在创建顶部窗口并将其标记为可见时初始化顶部窗口。