GtkBuilder не реализует виджеты? - PullRequest
0 голосов
/ 28 ноября 2011

У меня есть простой 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);
  // ...
}

Все работает нормально и никаких ошибок не появляется.Я попытался сделать несколько вещей, чтобы заставить draw_area реализовать версию GtkBuilder, но ничего не получалось.Есть ли какая-то волшебная уловка, которую я здесь забыл?

1 Ответ

1 голос
/ 21 сентября 2012

Установите для свойства Visible верхнего окна значение False.

У меня была точно такая же проблема последние пару недель.XML-файл glade, который я преобразовал из glade2 в glade3, использующий gtkglext, просто не будет принимать вызов gtk_widget_set_gl_capability.После прочтения этого поста и сравнения с работающим файлом (благодаря Jose Commins) я понял, что для свойства visible в верхнем окне установлено значение True.Измените его на False, все работает.Поскольку все верхние окна в старом файле glade2 были установлены в True, это должно было быть по умолчанию.Более новое программное обеспечение устанавливает его в False.Конструктор должен инициализировать верхнее окно при его создании и помечать его как видимое, в отличие от старой практики кода на С, состоящей в ожидании, пока функции создания явно не были вызваны.

...