GtkBuilder没有实现小部件?

时间:2011-11-27 20:15:24

标签: c gtk glade

我有一个简单的Glade文件包含在C源代码中。以下是有趣的部分:

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,但没有任何效果。我忘记了一些神奇的技巧吗?

1 个答案:

答案 0 :(得分:1)

将顶部窗口的Visible属性设置为False

过去几周我遇到了完全相同的问题。我从glade2转换为使用gtkglext的glade3的glade xml文件不接受gtk_widget_set_gl_capability调用。在我阅读这篇文章并与一个正常运行的文件进行比较后(感谢Jose Commins),我意识到顶部窗口的visible属性设置为True。将其更改为False,一切正常。由于旧glade2文件中的所有顶级窗口都设置为True,因此必须是默认窗口。较新的软件将其设置为False。生成器必须在创建顶窗时初始化并标记为可见,这与旧的C代码实践相反,即等待显式函数被显式调用。