LINUX.ORG.RU

Gtk+ не срабатывает lookup_widget()


0

0

Здравствуйте! Пытаюсь разобраться с азами GTK+, и застопорился на следующем:

Набросал в Anjuta простое приложение на Gtk+ и C, состоящее из окна, в котором контейнер-таблица, в таблице - кнопка и надпись. Пробую по нажатию кнопки изменить надпись. Исходный код такой:

[code] void on_button1_clicked (GtkButton *self, gpointer user_data) { GtkWidget *toplevel = gtk_widget_get_toplevel(GTK_WIDGET(self)); if (GTK_WIDGET_TOPLEVEL (toplevel)) g_print("\n\nToplevel found, it's name is: %s \n",gtk_widget_get_name(toplevel)); GtkWidget *lab = lookup_widget(GTK_WIDGET(toplevel), "lbl"); gtk_label_set_text(GTK_LABEL(lab), "Some label"); } [/code]

Собирается нормально, но при выполнении функция lookup_widget не находит виджет lbl, получаю сообщения:

WARNING **: Widget not found: window (gtk_foobar:14066): Gtk-CRITICAL **: gtk_label_set_text: assertion `GTK_IS_LABEL (label)' failed

При этом toplevel находится нормально, и его имя g_print'ом выводится. Куда копать?

Заранее благодарю.


Легких путей не ищем, да? =)

#include <gtk/gtk.h>

static void do_it (GtkButton *btn, gpointer data)
{
    gtk_label_set_text (GTK_LABEL (data), "MOOOAR!");
}

int main (int argc, char **argv)
{
    GtkWidget *wnd, *vbx, *btn, *lbl;
    
    gtk_init (&argc, &argv);

    wnd = gtk_window_new (GTK_WINDOW_TOPLEVEL);

    vbx = gtk_vbox_new (TRUE, 0);
    gtk_container_add (GTK_CONTAINER (mainwin), vbx);

    lbl = gtk_label_new ("Hello world!");
    btn = gtk_button_new_with_label ("Do it");

    gtk_box_pack_start (GTK_BOX(vbx), lbl, TRUE, TRUE, 0);
    gtk_box_pack_start (GTK_BOX(vbx), btn, TRUE, TRUE, 0);

    g_signal_connect (button, "clicked", G_CALLBACK (do_it), lbl);

    gtk_widget_show_all (wnd);
    gtk_main ();

    return 0;
}

P.S. писал по памяти, не канпелировал, надеюсь смысл ясен

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

Смысл ясен, но Ваш код, как я понял, создаёт виджеты сам, у меня же интерфейс создан в Glade, что мне пока больше нравится.

nio-kun
() автор топика
Ответ на: комментарий от nio-kun

а в чем проблема с глейдом в этом случае?

mono ★★★★★
()

А что мешает получить виджет напрямую из xml ? Типа:
lab = glade_xml_get_widget(xml,"label1");

Rupricht ★★
()
Ответ на: комментарий от nio-kun

> Смысл ясен, но Ваш код, как я понял, создаёт виджеты сам, у меня же интерфейс создан в Glade, что мне пока больше нравится.

Если не ошибаюсь, старый Glade 2 позволяет сгенерировать C-код. И там было придумано lookup_widget(). Потом же в Glade 3 эту возможность убрали. Зато ввели выше упомянутый очень простой способ получения ссылки из xml.

Между тем, не так давно (Glade 3.6.0, 16 марта 2009) пришла даже смена libglade'у - GtkBuilder - новый API для работы с графическим интерфейсом, созданном в Glade.

gag ★★★★★
()

Спасибо всем ответившим. Наконец-то вернулся к этому вопросу, оказывается, надо так:

#include <glade/glade.h>
...

void on_button1_clicked (GtkButton *self, gpointer user_data)
{
GladeXML *xml = glade_get_widget_tree(GTK_WIDGET(self));
GtkWidget *lab = glade_xml_get_widget(xml,"lbl");
gtk_label_set_text(GTK_LABEL(lab), "Some label");
}
Оставляю решение здесь на случай, если у какого-нибудь новичка в GTK+, вроде меня, возникнет этот же вопрос.

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