The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"новичек в Gtk+"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"новичек в Gtk+"  
Сообщение от Rtl on 10-Май-08, 12:23 
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);
и после этой функции размер возвращается к исходному

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "новичек в Gtk+"  
Сообщение от Rtl on 10-Май-08, 15:49 
значит все юзают Qt...
зря за Gtk взялся...
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "новичек в Gtk+"  
Сообщение от E.L.K. email on 11-Май-08, 03:23 
>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);
>}

Я так понимаю, перебор идет не по i, а по n?
Иначе я просто затрудняюсь увидеть тут увеличение n. (:
Видимо, вся проблема в том, что передавая &n, то есть _адрес_ переменной n, ты получаешь в рез-те то, что выводимое тобой *(gint*)data является тем же самым n. Вернее значением, взятым по адресу, где хранится n. Фактически, если ты остановишь цикл на 4х итерациях вместо 8ми, то получишь

data: 4
data: 4
data: 4

Если посмотришь в отладчике в нутри callback'а, то ты увидишь, что они все получают одинаковый параметр - адрес переменной n. Что ты, собственно, туда и передал. (:

Передавай значение.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "новичек в Gtk+"  
Сообщение от NuINu (??) on 11-Май-08, 21:37 
Ну почему же никто не программирует? программируют, достаточно взглянуть на убунту.
Другое дело в россии это делают так, ни шатко не валко. :-)
Если хотите освоить ГТК приобретите пару книг:
Андрей Костельцов GTK+ Разработка переносимых интерфесов
Артур Гриффитс Программирование GNOME/GTK+

Ага на первый ответили, ну повторюсь.
1)g_signal_connect (G_OBJECT (button), "clicked",G_CALLBACK (click),&n);
ну когда в цикле делаешь коннект со ссылкой на одну и туже переменную вряд ли стоит ожидать что поведение функций будет различным попробуй так:
g_signal_connect (G_OBJECT (button), "clicked",G_CALLBACK (click),i);

2)можно конечно и так как ты написал. но можно и так:
   gtk_button_set_image(GTK_BUTTON(widget), image_2);
тут есть одна тонкость если захочешь использовать image_1, то он окажеться уже удаленным :)
что бы этого не произошло сделай предварительно:
gtk_widget_ref(image_1);


3) что бы окно не меняло размер надо вызвать функцию ....
gtk_window_set_resizable(GTK_WINDOW(window),FALSE);
правильно :)

а вот чтобы оно не уменьшалось надо задать необходимый размер ВЛОЖЕННОГО в окно
виджета:
gtk_widget_set_size_request(widget_in_window, 360, 360);
ну а за ним и gtk_window_set_resizable вызвать.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру