Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Anjuta  (Прочитано 1524 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн htr

  • Автор темы
  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
Anjuta
« : 19 Декабря 2011, 08:44:55 »
У меня первый тестовый проект.
В анюте при помощи встроенного редактора интерфейсов (glade) создал окно, там поместил две кнопки, у кнопок общий обработчик сигнала clicked, проект откомпилировался, запускается и работает, т.е. при нажатии кнопок запускается обработчик.
Вопрос, как передать обработчику какой-либо параметр при нажатии кнопки, как например тут:
#include <gtk/gtk.h>

static void button_clicked(GtkWidget * widget, gpointer data)
{
  gint i = * (gint *) data;
  g_print("Button #%i is pressed!\n", i);
}
static gboolean delete_event(GtkWidget * widget, GdkEvent * event, gpointer data)
{
  g_print("Delete event occurred\n");
  return FALSE;
}
static void destroy(GtkWidget * widget, gpointer data)
{
  g_print("Destroy signal sent\n");
  gtk_main_quit();
}
int main(int argc, char ** argv)
{
  GtkWidget * window;
  GtkWidget * button1;
  GtkWidget * button2;
  GtkWidget * box;
  gint i1, i2;
  gtk_init(&argc, &argv);
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "Buttons");
  gtk_container_set_border_width(GTK_CONTAINER(window), 10);
  g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(delete_event), NULL);
  g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL);
  box = gtk_hbox_new(TRUE, 2);
  gtk_container_add(GTK_CONTAINER(window), box);
  button1 = gtk_button_new_with_label("Выход");
  i1 = 1;
  g_signal_connect(G_OBJECT(button1), "clicked", G_CALLBACK(button_clicked), &i1);
  g_signal_connect_swapped(G_OBJECT(button1), "clicked", G_CALLBACK(gtk_widget_destroy), G_OBJECT(window));
  gtk_box_pack_start(GTK_BOX(box), button1, TRUE, TRUE, 0);
  button2 = gtk_button_new_with_label("Кнопка 2");
  i2 = 2;
  g_signal_connect(G_OBJECT(button2), "clicked", G_CALLBACK(button_clicked), &i2);
  gtk_box_pack_start(GTK_BOX(box), button2, TRUE, TRUE, 0);
  gtk_widget_show(button1);
  gtk_widget_show(button2);
  gtk_widget_show(box);
  gtk_widget_show(window);
  gtk_main();
  return 0;
}       

В этом примере окно прописывается руками, и соответственно все сигналы. А как быть с анютой, там визуальный редактор, кроме обработчика прописывать ничего не надо, только вот понять не могу, как обработчику передать параметр.
Ubuntu 11.10
Gnome 3.2.1
Anjuta 3.2.0
Спасибо.


Пользователь решил продолжить мысль 19 Декабря 2011, 13:30:48:
В общем отвечу сам.
То что мне удалось выяснить - это то  что такое не возможно.
Функция которая используется для подключения сигналов gtk_builder_connect_signals может передавать дополнительные параметры, но они будут для всех сигналов, подключённых из UI.
Отсюда вывод, если есть необходимость использовать одну функцию на несколько кнопок, нужно либо руками прописывать, не полагаясь на автоматизм, либо, как альтернативный вариант, на каждую кнопку свой обработчик, и из него вызывать общую функцию с нужными параметрами...

Пользователь решил продолжить мысль 19 Декабря 2011, 17:56:54:
P.S.
Чуть больше разобрался с механизмом который предоставляет анюта.
Когда виджету назначается сигнал, через встроенный в анюту визуальный редактор, в нашем случае clicked, указывается обработчик, также там есть поле "Данные пользователя". Сразу возникает идея, что как раз через этот параметр ("Данные пользователя") и можно передать ваши данные, но при щелчке по нему, там можно выбрать только виджеты.
Из примера выше при щелчки по кнопке "Выход" у нас вызывается два обработчика, один button_clicked второй gtk_widget_destroy. В анюте я назвал данные обработчики button1_clicked и widget_destroy соответственно, почему второй обработчик widget_destroy а не gtk_widget_destroy - это потому что gtk_widget_destroy требует параметр GtkWidget *, передавать какие либо параметры обработчику через визуальный редактор не предусмотрено, поэтому я отдельно создал обработчик. Далее, функция обработчика принимает 2 параметра (GtkWidget * widget, gpointer data). После долгих экспериментов мне удалось выяснить, что в первом параметре (GtkWidget * widget) содержится ссылка на виджет выбранный в поле "Данные пользователя" в визуальном редакторе, а второй параметр (gpointer data) содержит ссылку на виджет кнопки, которая нажата.
Если в поле "Данные пользователя" ничего не выбрано, то параметр (GtkWidget * widget) будет NULL, а второй параметр (gpointer data) будет всё равно содержит ссылку на виджет кнопки.
Вот такой механизм, соответственно таким образом можно определять какая кнопка нажата, и выбирать нужный параметр. Для чего выбирать в поле "Данные пользователя" виджет, я думаю это скорей всего для определения целевого виджета, т.е. для которого предназначено нажатие кнопки. У меня в примере, я таким образом завершаю приложение, выбрав в поле "Данные пользователя" главный виджет window.
Да почитал сейчас что написал - свихнуться  :idiot2:.
Вот готовый пример для анюты, такой же как и выше.
Будут вопросы - спрашивайте.
« Последнее редактирование: 19 Декабря 2011, 17:56:54 от htr »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Anjuta
« Ответ #1 : 20 Декабря 2011, 08:10:49 »
Продолжай. Нам интересно =)

Оффлайн htr

  • Автор темы
  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
Re: Anjuta
« Ответ #2 : 20 Декабря 2011, 08:25:30 »
Продолжай. Нам интересно =)

Немножко не понял, здесь уже законченный пример приложения helloworld под анюту с использованием gtk.
Что продолжать?

Оффлайн amdlintuxos

  • Любитель
  • *
  • Сообщений: 86
    • Просмотр профиля
Re: Anjuta
« Ответ #3 : 22 Декабря 2011, 22:00:46 »
htr
это шутят так
что не збудется - позабудется

 

Страница сгенерирована за 0.042 секунд. Запросов: 25.