новичек в Gtk+ (g_signal_connect gtk_container_remove gtk_window_set_default_size)
Модератор: Модераторы разделов
-
zls
- Сообщения: 26
новичек в Gtk+
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);
и после этой функции размер возвращается к исходному
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+
1) - разумеецо. Вы отдаете адрес одной и той же переменной в цикле, который одинаков во всех коннектах; плюс не ясно из кода, что такое n, адрес которого отдается с коннектами.
Разместите глобальный массив, скажем, -
int vals [9] ;
инициализируйте где-нибудь -
for (int i = 0 ; 9 != i ; ++ i) vals [i] = i ;
и дальше в своем цикле, уже внутри функции, скармливайте адреса & vals [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
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
-
zls
- Сообщения: 26
Re: новичек в Gtk+
как сменить иконку на кнопке?
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 отсылает смотреть слабо документированные инклуды ^_^
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+
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+
P.S. Ох как не хватает единой справочной системы типа M$DN ), а стандартная документация Gtk отсылает смотреть слабо документированные инклуды ^_^
qt?
-
pcodr
- Сообщения: 283
- ОС: Debian
Re: новичек в Gtk+
indie писал(а): ↑11.05.2008 11:15window=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+
как сменить иконку на кнопке?
http://library.gnome.org/devel/gtk/stable/...utton-set-image
tutorial на русском
справка на русском
все сказанное есть имхо...
-
halturin
- Сообщения: 167
- ОС: Linux
Re: новичек в Gtk+
Речь вообще-то про GTK.
Лично для меня весьма достаточная документация. Поставь себе devhelp и пачку документации gtk-doc, glib-doc и тд. Вполне хорошая библиотека программиста. Но это справочники. Что же касается примеров, у меня всегда под рукой пачка исходников GTK-проектов, включая исходники libgtk - это примеры, которые уже работают, а не просто наброски, которые теоретически должны работать.
-
halturin
- Сообщения: 167
- ОС: Linux
Re: новичек в Gtk+
Что же касается кнопки и картинки... почитай на предмет 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+
А подскажите как подружить GTK c русским? Вставляю русский текст в utf-8 кодирвке (это моя локаль) в MessageDialog, а оно мне кракозябры некрасивые пишет.
В тоже время если вписать русские буквы в текстовое поле в моей скомпилированной и запущенной программе (она считает и запишет в файл),то текст в файле получается правильный, в utf-8.
В тоже время если вписать русские буквы в текстовое поле в моей скомпилированной и запущенной программе (она считает и запишет в файл),то текст в файле получается правильный, в utf-8.
remote system type is unix
-
halturin
- Сообщения: 167
- ОС: Linux
Re: новичек в Gtk+
pcodr писал(а): ↑11.05.2008 14:31А подскажите как подружить GTK c русским? Вставляю русский текст в utf-8 кодирвке (это моя локаль) в MessageDialog, а оно мне кракозябры некрасивые пишет.
В тоже время если вписать русские буквы в текстовое поле в моей скомпилированной и запущенной программе (она считает и запишет в файл),то текст в файле получается правильный, в utf-8.
у ГТК с юникодом все хорошо, как ни кого другого. Здесь проблема кажется где-то у тебя. Было бы здорово глянуть на исходник. А что за MessageDialog? просто попахивает виндовой терминологией
-
pcodr
- Сообщения: 283
- ОС: Debian
Re: новичек в Gtk+
А что за MessageDialog? просто попахивает виндовой терминологией
Побойся бога, это обычный GtkMessageDialog
Мда, попробовал я тут написать тестовую программу на С (вообще я пишу на perl) и как оказалось с русским там все впорядке. Значит дело в perl.
remote system type is unix
-
zls
- Сообщения: 26
Re: новичек в Gtk+
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
-
halturin
- Сообщения: 167
- ОС: Linux
Re: новичек в Gtk+
zls писал(а): ↑12.05.2008 04:48halturin писал(а): ↑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ем спасибо.
Ты канешь извини, но трава у тебя забористая
Дело конечно хозяйское, но ИМХО это подход через технологическое отверстие.
-
zls
- Сообщения: 26
Re: новичек в Gtk+
Все от нехватки нормальной документации ), хотя, обнаружив такое в официальной "GTK+ 2.0 Tutorial" не стоит ругать разработчиков:
Недокументированные виджеты
Требуются авторы для описания работы всех виджетов перечисленных в этом разделе! :) Пожалуйста окажите помощь в дополнении и расширении данного руководства.
Если вам нужно использовать какиенибудь из недокументированных виджетов, то обратитесь к заголовочным файлам поставляемым вместе с дистрибутивом GTK. Имена функций GTK's очень описательные. Как работает виджет можно понять по его декларации и используя примеры похожих виджетов.
Когда вы хорошо разберётесь в работе недокументированного виджета и его функциях, рассмотрите возможность написать раздел в данное руководство, так вы окажете помощь другим людям и сэкономите их время.
Прочитав это, /me чуть не прослезился и все им простил ^_^