Как вернуть значение из функции, вызываемой с помощью gtk callback? - PullRequest
0 голосов
/ 09 апреля 2011

Я новичок в программировании на gtk и C и у меня есть два конкретных вопроса, пока я работаю над графическим интерфейсом для моего C-приложения.

  1. Я вызвал функцию с помощью обратного вызова в моем коде, и функция должна возвращать значение. Как получить значение в моем main из функции?

  2. Каков наилучший способ реализовать множество вызовов функций из вызовов основной или вложенной функции в графическом интерфейсе с использованием GTK. Если я спроектирую и открою новое окно при каждом вызове функции, и если это так, то как мне закрыть его, когда его работа закончена, или у меня есть какой-то способ, которым я могу изменить содержимое того же окна через вызовы функций после некоторого / O по функциям.

Пример кода, в котором я хочу, чтобы функция hello возвращала значение 144 после вызова обратным вызовом в main.

#include <gtk/gtk.h>

static gboolean delete_event( GtkWidget *widget,
                              GdkEvent  *event,
                              gpointer   data )
{
    g_print ("delete event occurred\n");
    return FALSE;
}


int hello(GtkWidget *widget, gpointer  data)
{
    int a=144;
    return a;
}


/* Another callback */
static void destroy( GtkWidget *widget,
                     gpointer   data )
{
    gtk_main_quit ();
}

int main( int   argc,
          char *argv[] )
{
    GtkWidget *window;
    GtkWidget *button;

    int value; 

    gtk_init (&argc, &argv);

    /* create a new window */
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    g_signal_connect (window, "delete-event",
              G_CALLBACK (delete_event), NULL);
    g_signal_connect (window, "destroy",
              G_CALLBACK (destroy), NULL);
    gtk_container_set_border_width (GTK_CONTAINER (window), 10);
    button = gtk_button_new_with_label ("Hello World");
    g_signal_connect (button, "clicked",
              G_CALLBACK (hello), NULL);

    //        printf("value is %d",value);
    gtk_container_add (GTK_CONTAINER (window), button);
    gtk_widget_show (button);
    gtk_widget_show (window);
    gtk_main ();

    return 0;
}

Ответы [ 3 ]

2 голосов
/ 11 апреля 2011

В вашей главной:

int value = 0;
g_signal_connect (button, "clicked", G_CALLBACK (hello), &value);

Вы также должны соблюдать прототип обратного вызова сигнала. В вашем коде вы заставили его вернуть int ... Для сигнала GtkButton :: clicked это:

void user_function (GtkButton *button, gpointer user_data)

Затем, чтобы вернуть ваше значение, просто измените переменную внутри обратного вызова:

int hello (GtkWidget *widget, gpointer data)
{
    int *a = data;
    *a = 144;
}

Если вам нужно вернуть несколько значений, используйте структуру вместо целого.

Ваш второй вопрос мне очень непонятен, поэтому я не могу на него ответить.

1 голос
/ 09 апреля 2011

Один из способов передачи значений из обратного вызова - дать указатель на некоторое хранилище для g_signal_connect(). Этот указатель затем будет передан вашему обработчику, который может записать туда свое «возвращаемое значение». Вы также можете передать адрес другой функции (или адрес структуры, содержащей и данные, и указатель на функцию, или что-то еще), чтобы включить более сложные поведения в вашей функции-обработчике.

Что касается вашего второго вопроса, я не думаю, что понимаю его, и в любом случае каждый вопрос должен быть здесь.

0 голосов
/ 11 апреля 2011

Как уже говорили другие, если вам нужно получить данные из обратного вызова, вам нужно передать указатель и установить значение в этом месте, потому что вы не можете вернуть.

Это имеет смысл, если вы думаете о том, что на самом деле происходит. Когда вы устанавливаете обратный вызов при вызове g_signal_callback (), вы фактически не вызываете обратный вызов, вы просто передаете указатель на вашу функцию, которую GTK затем хранит внутри для последующего использования.

Как только вы вызываете gtk_main (), вы передаете управление своей программой главному циклу gtk. Там, когда сигналы получены, главный цикл gtk вызовет ваши функции, но вы не можете контролировать то, что происходит внутри основного цикла gtk, он не ожидает возврата значения от вашей функции, и если вы могли бы что-то вернуть, вы ' Я не мог сказать GTK, что с ним делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...