LINUX.ORG.RU

[GTK] не передается структура

 


0

0

возникла такая проблема, есть 3 текстовых лейбла и одна кнопка, нужно передать в колбэк все 3 текстовых поля, чтоб при помощи кнопки они изменялись.

объединил в структуру поля

typedef struct {
GtkWidget *string;
GtkWidget *string1;
GtkWidget *button;
GtkWidget *string2;
} StrData;

далее создаю элементы в цикле и заполняю их

StrData *str[i];

str[i] = calloc (1, sizeof(StrData));

str[i]->string = gtk_label_new(row[0]);
gtk_fixed_put(GTK_FIXED(frame), str[i]->string, 20, 60+(i*50));

str[i]->string1 = gtk_label_new(row[1]);
gtk_fixed_put(GTK_FIXED(frame), str[i]->string1, 20, 80+(i*50));

str[i]->string2 = gtk_label_new(row[2]);
gtk_fixed_put(GTK_FIXED(frame), str[i]->string1, 20, 100+(i*50));

str[i]->button = gtk_button_new_with_label("-");
gtk_widget_set_size_request(str[i]->button, 50, 20);
gtk_fixed_put(GTK_FIXED(frame), str[i]->button, 20, 120+(i*50));

g_signal_connect(str[i]->button, "clicked", G_CALLBACK(decrease), str[i]);

сама колбэк-функция

void decrease(GtkWidget *widget, gpointer str)
{
gtk_label_set_text(str->string, "test");
gtk_label_set_text(str->string1, "test1");
gtk_label_set_text(str->string2, "test2");
}

и тут компилятор (gcc 4.4.3) ругается

main.c:10: error: request for member ‘string’ in something not a structure or union

почему это не структура? то есть доступа к виджетам нет, вроде все проверил, что не так? напутал что то с указателями?

Ответ на: комментарий от Rudcozt

Как-то так.

void decrease(GtkWidget *widget, gpointer str) 
{ 
StrData* strdata = (StrData*) str;
gtk_label_set_text(strdata->string, "test"); 
gtk_label_set_text(strdata->string1, "test1"); 
gtk_label_set_text(strdata->string2, "test2"); 
} 
Rudcozt
()
Ответ на: комментарий от Rudcozt

Спасибо большое, все заработало
единственное пару вопросов появилось
а что если структура объявлена в main()? всмысле она не глобальная
компилятор теперь выдает warning

main.c:19: warning: passing argument 1 of ‘gtk_label_set_text’ from incompatible pointer type /usr/include/gtk-2.0/gtk/gtklabel.h:112: note: expected ‘struct GtkLabel *’ but argument is of type ‘struct GtkWidget *’

можно как нибудь привести структуру к виду GtkLabel?

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

Какая разница, где она объявлена? Прочитай про приведение типов.

Еще в гтк емнип были какие-то хитрые макросы для этих целей.

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