LINUX.ORG.RU

GTK - gtk_builder_get_object()возвращает NULL


0

0

Имя окна правильное , путь к файлу правильный, gtk_builder_add_from_file возвращает 0. Сам UI сделан в Glade и вчера это работало. А сегодня весь день как баран экран бодаю. Наверно опять ерунда, но не вижу. Ошибку выдаёт (gtk_foobar:7269): Gtk-CRITICAL **: gtk_builder_add_from_file: assertion `error == NULL || *error == NULL' failed

а где о ней почитать не найду. И вообще, как можно этот процесс в Анюте контролировать? А то gtk_widget_show_all или gtk_main обругают или, хуже, в себя уйдут. Может где-то это описано. Или опять в исходники лезть? так в них ещё и разобраться нужно.

Перед вызовом любой функции принимающей GError** этот самый error надо сбрасывать в NULL.

k_andy ★★★ ()
Ответ на: комментарий от k_andy

действительно GError стала ошибку показывать: invalid root element 'glade-interface' спасибо, это правило мне неведомо было. Но что там плохого я не понял. - Только вчера стал этим заниматься даже не знаю что почитать конкретно по UI в xml виде:

<?xml version=«1.0»?>

<glade-interface>

<!-- interface-requires gtk+ 2.6 -->

<!-- interface-naming-policy toplevel-contextual -->

<widget class=«GtkWindow» id=«window»>

<property name=«visible»>True</property>

<property name=«title» translatable=«yes»>&#x41F;&#x440;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440; &#x438;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439;</property>

<property name=«default_width»>250</property>

<property name=«default_height»>156</property>

<child>

<widget class=«GtkEntry» id=«entry1»>

<property name=«visible»>True</property>

<property name=«can_focus»>True</property>

<property name=«invisible_char»>&#x25CF;</property>

</widget>

</child>

</widget>

</glade-interface>

Sergey ()
Ответ на: комментарий от Sergey

>>Но что там плохого я не понял.

Корневым элементом должен быть <interface>. Ты используешь устаревший формат libglade, пора переходить на формат GtkBuilder. И да, как тебе уже сказали, GError перед передачей в функцию надо не просто в NULL сбросить, но и очистить память g_error_free (), если это требуется.

MuZHiK-2 ★★★★ ()
Ответ на: комментарий от MuZHiK-2

Формат сменил, теперь <interface> в корне. g_error_free () натыкал перед каждым вызовом. ошибка такая (gtk_foobar:9133): GLib-CRITICAL **: g_error_free: assertion `error != NULL' failed

убрал g_error_free () ошибка та-же.

А можно где-то об этом почитать, чтобы людей глупостями не отвлекать? По опыту предполагаю, что причина ерундовая. Вот например благодаря вам нашёл это http://docstore.mik.ua/manuals/ru/glib_api/glib-Error-Reporting.html похоже на подробное описание. А чего-то ещё , временем проверенного нет?

Sergey ()
Ответ на: комментарий от Sergey

>>Формат сменил, теперь <interface> в корне.

Там, скорее всего, надо не просто корень менять, а сам формат. Есть два формата: старый libglade и новый GtkBuilder. При создании файла интерфейса выставляй формат GtkBuilder.

ошибка такая (gtk_foobar:9133): GLib-CRITICAL **: g_error_free: assertion `error != NULL' failed

Правильно, ты пытаешься освободить пустой нуловый объект. g_error_free () вызывается только в том случае, если результат ошибки вернулся положительным (т.е. ошибка была).

убрал g_error_free () ошибка та-же.

Ты инициализируешь объект GError в NULL перед его первым использованием?

А чего-то ещё , временем проверенного нет?

Прочитай http://library.gnome.org/devel/glib/2.24/glib-Error-Reporting.html , тут все разжевано, как использовать объект GError для работы с ошибками. И на всякий случай по GtkBuilder: http://library.gnome.org/devel/gtk/2.20/GtkBuilder.html .

MuZHiK-2 ★★★★ ()
Ответ на: комментарий от MuZHiK-2

Благодарю за ссылки - хороших книг много не бывает. Истользую GtkBuilder, указатель на ошибку обнуляю перед загрузкой файла, а потом не использую. Собственно вот:

GError *err = NULL;

gint a = gtk_builder_add_from_file(builder, <filename>,&err);

GObject* point = gtk_builder_get_object(builder, «window»);

if(point) { сюда не попадаю; } ;

Попробую расширить кругозор по вашим материалам.

Sergey ()
Ответ на: комментарий от Sergey

Наврал я вам. Когда я новый UI файл сделал, то Glade назвал главное окно window1, а я знал об этом да не сразу вспомнил. Сейчас наконец окошко появилось.

Благодарю за помощь.

Sergey ()
Ответ на: комментарий от Sergey

Вообще, правилом хорошего тона является хранение ссылки на объект GtkBuilder в приватной структуре объекта. И уничтожение этой ссылки в dispose методе объекта. Это на всякий случай :)

MuZHiK-2 ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.