[solved]Gtk/Glade повторное использование объектов из xml файла.

Модератор: Модераторы разделов

n0m4d
Сообщения: 2

[solved]Gtk/Glade повторное использование объектов из xml файла.

Сообщение n0m4d »

Привет.
В глейд сделал интерфейс - окно, в нем кнопка и ноутбук, в ноутбуке метка.
http://img146.imageshack.us.local/my.php?image=screenshot1mg5.png вот скрин.
Пытаюсь реализовать такую логику: при нажитии на кнопку должен создаваться новый таб у ноутбука, с точно такими же виджетами но другими данными. Например на первом табе будет метка с надписью 1, на втором 2 и тд.

Чтобы это сделать нужно создать дочерний виджет и добавить его к ноутбуку. Я пытаюсь использовать уже созданный макет интерфейса.
Для этого я открываю хмл файл интерфейса и загружаю vbox2(см скриншот).

Тут появляется две проблемы:
1) когда я запускаю код, получаю месседж от гтк

(notebook:8502): Gtk-WARNING **: Can't set a parent on widget which has a parent

Т.е. гтк говорит что пытаюсь сделать ноутбук родителем конейнера, когда у него уже есть родитель. Но что делать? Если я хочу получить точно такой-же таб?

2) после загрузки контейнера vbox2, как мне получить доступ к label которая находится внутри него, чтобы изменить ее данные(текст)?
Спасибо сказали:
Serik
Сообщения: 149
ОС: SuSE Linux

Re: [solved]Gtk/Glade повторное использование объектов из xml файла.

Сообщение Serik »

1) Что-то не то создаете, покажите код
2) Можно получить виджет по названию glade_xml_get_widget
или получить содержимое контейнера
gtk_container_get_children
Спасибо сказали:
n0m4d
Сообщения: 2

Re: [solved]Gtk/Glade повторное использование объектов из xml файла.

Сообщение n0m4d »

Вот код. По пункту спасибо за наводку, буду разбираться.

Код: Выделить всё

#include <gtk/gtk.h>

void
on_window_destroy (GtkObject *object, gpointer user_data)
{
   gtk_main_quit();
}



void on_button_clicked(GtkButton *button, GtkNotebook *notebook)
{
   gint response;
   GtkWidget        *page;
   GtkBuilder        *builder;

   builder = gtk_builder_new ();

   gtk_builder_add_from_file (builder, "notebook.xml", NULL);    //вот здесь я хочу вытащить контейнер vbox2
   page = GTK_WIDGET (gtk_builder_get_object (builder, "vbox2"));
   g_object_unref (G_OBJECT (builder));

   response = gtk_notebook_append_page(notebook,page,NULL);      //чтобы использовать его как содержание нового таба, т.е. дочерний обьект


   g_print ("response %d \n", response);

}

int
main (int argc, char *argv[])
{
   GtkBuilder              *builder;
   GtkWidget               *window;
   GtkNotebook             *notebook;


   gtk_init (&argc, &argv);
   builder = gtk_builder_new ();
   gtk_builder_add_from_file (builder, "notebook.xml", NULL);
   window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
   notebook = GTK_NOTEBOOK (gtk_builder_get_object (builder, "notebook"));




   gtk_builder_connect_signals (builder, notebook);
   g_object_unref (G_OBJECT (builder));
   gtk_widget_show (window);
   gtk_main ();

   return 0;
}
Спасибо сказали: