LINUX.ORG.RU

GtkNotebook добавление табов через коллбек


0

0

Привет.
Пытаюсь разобраться как работать с виджетом notebook. Написал код чтобы разобраться. 
Программа состоит из окна в котором ноутбук с одной вкладкой и кнопка.
При нажатии на кнопку должна добавляться новая вкладка, но получаю вот это: 

(notebook:31479): Gtk-CRITICAL **: gtk_notebook_append_page: assertion `GTK_IS_NOTEBOOK (notebook)' failed
 

Видимо не передается параметр в коллбек функцию, но как это исправить я не знаю, подскажите, пожалуйста.

А код такой(UI сделал в glade):

#include <gtk/gtk.h>
 
void 
on_window_destroy (GtkObject *object, gpointer user_data)
{
   gtk_main_quit();
}
 
//при срабатывании хендлера вылезает ошибка
//(notebook:31479): Gtk-CRITICAL **: gtk_notebook_append_page: assertion `GTK_IS_NOTEBOOK (notebook)' failed
void on_button_clicked(GtkObject *object, GtkWidget *notebook)
{
   gint response;
   GtkWidget		*page;
   GtkBuilder		*builder;
    
   builder = gtk_builder_new ();

   gtk_builder_add_from_file (builder, "notebook.xml", NULL); 
   page = GTK_WIDGET (gtk_builder_get_object (builder, "vbox2"));    
   gtk_builder_connect_signals (builder, NULL);          
   g_object_unref (G_OBJECT (builder));

   gtk_notebook_append_page(GTK_NOTEBOOK(notebook),page,NULL);
   g_print ("response %d \n", response);
}

int
main (int argc, char *argv[])
{
   GtkBuilder              *builder;
   GtkWidget               *window;
   GtkWidget               *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_WIDGET (gtk_builder_get_object (builder, "notebook"));
   gtk_builder_connect_signals (builder, NULL);          
   g_object_unref (G_OBJECT (builder));
        
   gtk_widget_show (window);       
   gtk_main ();
        
   return 0;
}

Смотрим на прототип обработчика события "кнопка нажата" и думаем

void GtkButton::clicked (GtkButton *,
gpointer);

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

The "clicked" signal

void                user_function                      (GtkButton *button,
                                                        gpointer   user_data)      : Run First / Action

Emitted when the button has been activated (pressed and released).

button :
	the object that received the signal

user_data :
	user data set when the signal handler was connected.

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

Эхъ... маладёж... :))

вот смотри, у тебя даже на скриншоте видно... справа, окошко button [GtkButton] Properties...

там третья колонка "User data", как думаешь, нафига она? так вот, не поленись, и заполни эту колонку для сигнала "clicked" ;) напиши туда нужный виджет, перепеши функцию обработчик так как я написал (именно аргументы функции), а потом, внутри функции надо делать нечто подобное:

GtkWidget *notebook = (GtkWidget*)user_data;

а дальше уже пользуйся своим notebook как обычно ;)

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

Не работает=( 
В глейде добавил notebook в третий столбец(user data)

Теперь XML выглядит так:

<signal handler="on_button_clicked" name="clicked" object="notebook"/>

Изменил обработчик:
void on_button_clicked(GtkObject *button, gpointer   user_data)
{
   gint response;
   GtkWidget		*page;
   GtkBuilder		*builder;
   GtkWidget 		*notebook = (GtkWidget*)user_data; 
    
   builder = gtk_builder_new ();

   gtk_builder_add_from_file (builder, "notebook.xml", NULL); 
   page = GTK_WIDGET (gtk_builder_get_object (builder, "vbox2"));    
   gtk_builder_connect_signals (builder, NULL);          
   g_object_unref (G_OBJECT (builder));

   response = gtk_notebook_append_page(GTK_NOTEBOOK(notebook),page,NULL);
   
   g_print ("response %d \n", response);
}

Изменился вывод, добавился warning:
(notebook:32540): GLib-GObject-WARNING **: invalid cast from `GtkButton' to `GtkNotebook'

(notebook:32540): Gtk-CRITICAL **: gtk_notebook_append_page: assertion `GTK_IS_NOTEBOOK (notebook)' failed
response -1 

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

Ну во-первых, по-правильному, функция должна выглядеть так:

void on_button_clicked(GtkButton *button, gpointer user_data)

а не как у тебя...

а во-вторых, нафига ты в обработчике опять открываешь файл гуи и коннектишь все сигналы? O_o

Cy6erBr4in ★★★
()

GTK ужасен.

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

Сейчас сделал функцию такую как ты сказал(копипастом=) ) - то же самое.

Про файл гуи - я хотел взять vbox из файла гуи и положить его на новый таб, сейчас понимаю что это не правильно. Но это уже другая проблема.

Главное это то что не передается парамтр, или может быть он передается, но почему-то проверку не проходит. Я уже весь день бьюсь, по всякому пытался=/

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

В общем я решил проблему.
Нужно было в gtk_builder_connect_signals (builder, NULL);
NULL заменить на данные которые вы хотите получить в хендлере.

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

Так тебе это же несколькими постами выше и говорили (про user_data)

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