The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
новичек в Gtk+, !*! Rtl, 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);
и после этой функции размер возвращается к исходному

  • новичек в Gtk+, !*! Rtl, 15:49 , 10-Май-08 (1)
    значит все юзают Qt...
    зря за Gtk взялся...
  • новичек в Gtk+, !*! E.L.K., 03:23 , 11-Май-08 (2)
    >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. Что ты, собственно, туда и передал. (:

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

    • новичек в Gtk+, !*! NuINu, 21:37 , 11-Май-08 (3)
      Ну почему же никто не программирует? программируют, достаточно взглянуть на убунту.
      Другое дело в россии это делают так, ни шатко не валко. :-)
      Если хотите освоить ГТК приобретите пару книг:
      Андрей Костельцов 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 вызвать.




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

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