новичек в Gtk+ (g_signal_connect gtk_container_remove gtk_window_set_default_size)

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

zls
Сообщения: 26

новичек в Gtk+

Сообщение zls »

1) Подключаю функцыю к 9 кнопкам, где в качестве данных передаю адрес gint переменной, при каждом вызове функции значение n увеличивается от 0 до 8
for(i=0;i<9;i++){
button = gtk_button_new ();
g_signal_connect (G_OBJECT (button), "clicked",G_CALLBACK (click),&n);
gtk_box_pack_start(GTK_BOX(hbox),button,FALSE,FALSE,0);
}

т.е. при нажатии на определенную кнопку должен происходить вызов одной и той же функции но с разным значением в data

static void click(GtkWidget *widget,gpointer data)
{
g_print("data: %d\n",*(gint*)data);
}

но выводится постоянно число 8

data: 8
data: 8
data: 8
data: 8
data: 8

Как тогда определить какая клавиша была нажата, для каждой кнопки заводить отдельную функцию обратного вызова?

2) Создал кнопку с изображением:

image_1 = gtk_image_new_from_file ("1.xpm");
image_2 = gtk_image_new_from_file ("2.xpm");
gtk_container_add (GTK_CONTAINER (button), image_1);

Как сменить иконку на кнопке с image_1 на image_2
так правильно?

gtk_container_remove (GTK_CONTAINER (widget), image_1);
gtk_container_add (GTK_CONTAINER (widget), image_2);
gtk_widget_show(image_2);

может есть правильный способ.

3) Как задать размер окна, и запретить изменение размера

window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
ставлю размер:
gtk_window_set_default_size(GTK_WINDOW(window),400,400);
запрещаю изменение размера:
gtk_window_set_resizable(GTK_WINDOW(window),FALSE);
и после этой функции размер возвращается к исходному
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: новичек в Gtk+

Сообщение sergio »

1) - разумеецо. Вы отдаете адрес одной и той же переменной в цикле, который одинаков во всех коннектах; плюс не ясно из кода, что такое n, адрес которого отдается с коннектами.

Разместите глобальный массив, скажем, -
int vals [9] ;
инициализируйте где-нибудь -
for (int i = 0 ; 9 != i ; ++ i) vals [i] = i ;
и дальше в своем цикле, уже внутри функции, скармливайте адреса & vals [n] ;
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
zls
Сообщения: 26

Re: новичек в Gtk+

Сообщение zls »

как сменить иконку на кнопке?

gtk_container_remove (GTK_CONTAINER (button), image_1);
gtk_container_add (GTK_CONTAINER (button), image_2);
gtk_widget_show(image_2);

такой вариант работает но он одноразовый, т.е. если надо циклически менять изображение image_1 <=> image_2,
то после вызова
gtk_container_remove (GTK_CONTAINER (button), image_1);

image_1 удаляется совсем.

и так не получается:
GdkPixbuf *pixbuf = gtk_image_get_pixbuf(GTK_IMAGE(image_1);
gtk_image_set_from_pixbuf(GTK_IMAGE(image_2),pixbuf);

подскажите плиз.

P.S. Ох как не хватает единой справочной системы типа M$DN ), а стандартная документация Gtk отсылает смотреть слабо документированные инклуды ^_^
Спасибо сказали:
Аватара пользователя
indie
Сообщения: 87

Re: новичек в Gtk+

Сообщение indie »

for(i=0;i<9;i++){
button = gtk_button_new ();
g_signal_connect (G_OBJECT (button), "clicked",G_CALLBACK (click),&n);
gtk_box_pack_start(GTK_BOX(hbox),button,FALSE,FALSE,0);
}
.....
static void click(GtkWidget *widget,gpointer data)
{
g_print("data: %d\n",*(gint*)data);
}


лучше так:
for(i=0;i<9;i++){
button = gtk_button_new ();
g_signal_connect (G_OBJECT (button), "clicked",G_CALLBACK (click), (gpointer) i);
gtk_box_pack_start(GTK_BOX(hbox),button,FALSE,FALSE,0);
....
static void click(GtkWidget *widget,gpointer data)
{
g_print("data: %d\n",(gint) data);
}

window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
ставлю размер:
gtk_window_set_default_size(GTK_WINDOW(window),400,400);
запрещаю изменение размера:
gtk_window_set_resizable(GTK_WINDOW(window),FALSE);
и после этой функции размер возвращается к исходному

на форуме недавно было, ищи
Спасибо сказали:
Аватара пользователя
unisky
Сообщения: 32
ОС: Debian GNU/Linux, *ubuntu

Re: новичек в Gtk+

Сообщение unisky »

P.S. Ох как не хватает единой справочной системы типа M$DN ), а стандартная документация Gtk отсылает смотреть слабо документированные инклуды ^_^

qt?
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: новичек в Gtk+

Сообщение pcodr »

indie писал(а):
11.05.2008 11:15
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
ставлю размер:
gtk_window_set_default_size(GTK_WINDOW(window),400,400);
запрещаю изменение размера:
gtk_window_set_resizable(GTK_WINDOW(window),FALSE);
и после этой функции размер возвращается к исходному

на форуме недавно было, ищи


Ага, привет от товарища по несчастью (?) :) =>
remote system type is unix
Спасибо сказали:
d_n_k
Сообщения: 636
ОС: Gentoo GNU/Linux

Re: новичек в Gtk+

Сообщение d_n_k »

все сказанное есть имхо...
Спасибо сказали:
Аватара пользователя
halturin
Сообщения: 167
ОС: Linux

Re: новичек в Gtk+

Сообщение halturin »

unisky писал(а):
11.05.2008 11:44
P.S. Ох как не хватает единой справочной системы типа M$DN ), а стандартная документация Gtk отсылает смотреть слабо документированные инклуды ^_^

qt?

Речь вообще-то про GTK.

Лично для меня весьма достаточная документация. Поставь себе devhelp и пачку документации gtk-doc, glib-doc и тд. Вполне хорошая библиотека программиста. Но это справочники. Что же касается примеров, у меня всегда под рукой пачка исходников GTK-проектов, включая исходники libgtk - это примеры, которые уже работают, а не просто наброски, которые теоретически должны работать.
Спасибо сказали:
Аватара пользователя
halturin
Сообщения: 167
ОС: Linux

Re: новичек в Gtk+

Сообщение halturin »

Что же касается кнопки и картинки... почитай на предмет object references (g_object_ref) и про то как долго живет объект в памяти.
Вот тебе колбек, присабач его к своей кнопке и любуйся :)

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

static void
click (GtkWidget *widget,gpointer data)
{
    static GtkWidget *im1 = NULL;
    static GtkWidget *im2 = NULL;
    static GtkWidget *last;
    if (im1 == NULL)
    {
        im1 = gtk_image_new_from_stock (GTK_STOCK_NEW, GTK_ICON_SIZE_BUTTON);
        im2 = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_BUTTON);
        g_object_ref (G_OBJECT (im1));
        g_object_ref (G_OBJECT (im2));
        last = im1;
    };

    if (last == im1)
        gtk_button_set_image (GTK_BUTTON (widget), im2);
    else
        gtk_button_set_image (GTK_BUTTON (widget), im1);

    last = (last == im1)?im2:im1;
    g_print("Click");
}
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: новичек в Gtk+

Сообщение pcodr »

А подскажите как подружить GTK c русским? Вставляю русский текст в utf-8 кодирвке (это моя локаль) в MessageDialog, а оно мне кракозябры некрасивые пишет.
В тоже время если вписать русские буквы в текстовое поле в моей скомпилированной и запущенной программе (она считает и запишет в файл),то текст в файле получается правильный, в utf-8.
remote system type is unix
Спасибо сказали:
Аватара пользователя
halturin
Сообщения: 167
ОС: Linux

Re: новичек в Gtk+

Сообщение halturin »

pcodr писал(а):
11.05.2008 14:31
А подскажите как подружить GTK c русским? Вставляю русский текст в utf-8 кодирвке (это моя локаль) в MessageDialog, а оно мне кракозябры некрасивые пишет.
В тоже время если вписать русские буквы в текстовое поле в моей скомпилированной и запущенной программе (она считает и запишет в файл),то текст в файле получается правильный, в utf-8.

у ГТК с юникодом все хорошо, как ни кого другого. Здесь проблема кажется где-то у тебя. Было бы здорово глянуть на исходник. А что за MessageDialog? просто попахивает виндовой терминологией :)
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: новичек в Gtk+

Сообщение pcodr »

А что за MessageDialog? просто попахивает виндовой терминологией :)


Побойся бога, это обычный GtkMessageDialog :)

Мда, попробовал я тут написать тестовую программу на С (вообще я пишу на perl) и как оказалось с русским там все впорядке. Значит дело в perl.
remote system type is unix
Спасибо сказали:
zls
Сообщения: 26

Re: новичек в Gtk+

Сообщение zls »

halturin писал(а):
11.05.2008 13:58
Что же касается кнопки и картинки... почитай на предмет object references (g_object_ref) и про то как долго живет объект в памяти.
Вот тебе колбек, присабач его к своей кнопке и любуйся :)

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

static void
click (GtkWidget *widget,gpointer data)
{
...
}


Сделал так:

image_button=gtk_image_new();
image_buf_1 = gtk_image_new_from_file ("1.xpm");
image_buf_2 = gtk_image_new_from_file ("2.xpm");
pixbuf_1 = gtk_image_get_pixbuf(GTK_IMAGE(image_buf_1));
pixbuf_2 = gtk_image_get_pixbuf(GTK_IMAGE(image_buf_2));

теперь чтоб сменить иконку в любом месте программы вызываю функцыю:

gtk_image_set_from_pixbuf(GTK_IMAGE(image_button),pixbuf_1);
или
gtk_image_set_from_pixbuf(GTK_IMAGE(image_button),pixbuf_2);

и иконка сменится на pixbuf_1 или pixbuf_2 вот и все, делов то ^_^

Вcем спасибо.
Спасибо сказали:
Serik
Сообщения: 149
ОС: SuSE Linux

Re: новичек в Gtk+

Сообщение Serik »

zls писал(а):
11.05.2008 07:55
P.S. Ох как не хватает единой справочной системы типа M$DN ), а стандартная документация Gtk отсылает смотреть слабо документированные инклуды ^_^
Есть отличная книга Andrew Krause Foundations of GTK+ Development
Актуальная информация, подробно и доступно.
Спасибо сказали:
Аватара пользователя
halturin
Сообщения: 167
ОС: Linux

Re: новичек в Gtk+

Сообщение halturin »

zls писал(а):
12.05.2008 04:48
halturin писал(а):
11.05.2008 13:58
Что же касается кнопки и картинки... почитай на предмет object references (g_object_ref) и про то как долго живет объект в памяти.
Вот тебе колбек, присабач его к своей кнопке и любуйся :)

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

static void
click (GtkWidget *widget,gpointer data)
{
...
}


Сделал так:

image_button=gtk_image_new();
image_buf_1 = gtk_image_new_from_file ("1.xpm");
image_buf_2 = gtk_image_new_from_file ("2.xpm");
pixbuf_1 = gtk_image_get_pixbuf(GTK_IMAGE(image_buf_1));
pixbuf_2 = gtk_image_get_pixbuf(GTK_IMAGE(image_buf_2));

теперь чтоб сменить иконку в любом месте программы вызываю функцыю:

gtk_image_set_from_pixbuf(GTK_IMAGE(image_button),pixbuf_1);
или
gtk_image_set_from_pixbuf(GTK_IMAGE(image_button),pixbuf_2);

и иконка сменится на pixbuf_1 или pixbuf_2 вот и все, делов то ^_^

Вcем спасибо.


Ты канешь извини, но трава у тебя забористая :) неее, твой вариант имеет право на существование, но я просто понять не могу, зачем такие сложные телодвижения с подменой пиксбуфа? когда проще переключать указатели с одного виджета (GtkImage) на другой.

Дело конечно хозяйское, но ИМХО это подход через технологическое отверстие.
Спасибо сказали:
zls
Сообщения: 26

Re: новичек в Gtk+

Сообщение zls »

halturin писал(а):
12.05.2008 14:24
Ты канешь извини, но трава у тебя забористая :)
...
Дело конечно хозяйское, но ИМХО это подход через технологическое отверстие.


Все от нехватки нормальной документации ), хотя, обнаружив такое в официальной "GTK+ 2.0 Tutorial" не стоит ругать разработчиков:

Недокументированные виджеты

Требуются авторы для описания работы всех виджетов перечисленных в этом разделе! :) Пожалуйста окажите помощь в дополнении и расширении данного руководства.
Если вам нужно использовать какиенибудь из недокументированных виджетов, то обратитесь к заголовочным файлам поставляемым вместе с дистрибутивом GTK. Имена функций GTK's очень описательные. Как работает виджет можно понять по его декларации и используя примеры похожих виджетов.
Когда вы хорошо разберётесь в работе недокументированного виджета и его функциях, рассмотрите возможность написать раздел в данное руководство, так вы окажете помощь другим людям и сэкономите их время.


Прочитав это, /me чуть не прослезился и все им простил ^_^
Спасибо сказали: