2013-09-30 3 views
0

У меня есть main.c, который связан с некоторыми заголовками и другими c-файлами. После завершения программы его программа на основе терминала, которая работает с пользовательским вводом с помощью switch.Its связана с аппаратной панелью, когда i дает «o», он открывается, и «c» он закрывается.вызов внешних функций в GTK + gui

У меня есть образец кода GTK + gui, написанный на c с открытыми cloase и кнопками quit. Как бы я связал свои открытые и закрытые функции с кнопками open и cloase в gui.

Это GTK код Возникают

#include <gtk/gtk.h> 

static void 
print_hello (GtkWidget *widget, 
      gpointer data) 
{ 
    g_print ("Hello World\n"); 
} 

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

    /* This is called in all GTK applications. Arguments are parsed 
    * from the command line and are returned to the application. 
    */ 
    gtk_init (&argc, &argv); 

    /* create a new window, and set its title */ 
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_title (GTK_WINDOW (window), "CANMate"); 
    g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); 
    gtk_container_set_border_width (GTK_CONTAINER (window), 50); 

    /* Here we construct the container that is going pack our buttons */ 
    grid = gtk_grid_new(); 

    /* Pack the container in the window */ 
    gtk_container_add (GTK_CONTAINER (window), grid); 

    button = gtk_button_new_with_label ("Open"); 
    g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL); 

    /* Place the first button in the grid cell (0, 0), and make it fill 
    * just 1 cell horizontally and vertically (ie no spanning) 
    */ 
    gtk_grid_attach (GTK_GRID (grid), button, 0, 0, 1, 1); 

    button = gtk_button_new_with_label ("Close"); 
    g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL); 

    /* Place the second button in the grid cell (1, 0), and make it fill 
    * just 1 cell horizontally and vertically (ie no spanning) 
    */ 
    gtk_grid_attach (GTK_GRID (grid), button, 1, 0, 1, 1); 

    button = gtk_button_new_with_label ("Quit"); 
    g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); 

    /* Place the Quit button in the grid cell (0, 1), and make it 
    * span 2 columns. 
    */ 
    gtk_grid_attach (GTK_GRID (grid), button, 0, 1, 2, 1); 

    /* Now that we are done packing our widgets, we show them all 
    * in one go, by calling gtk_widget_show_all() on the window. 
    * This call recursively calls gtk_widget_show() on all widgets 
    * that are contained in the window, directly or indirectly. 
    */ 
    gtk_widget_show_all (window); 

    /* All GTK applications must have a gtk_main(). Control ends here 
    * and waits for an event to occur (like a key press or a mouse event), 
    * until gtk_main_quit() is called. 
    */ 
    gtk_main(); 

    return 0; 
} 

ответ

1

В строке

g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL); 

вы «подключения» к «обработчик сигнала»: указание, что при button нажатии (то есть, испускает сигнал "clicked"), следует вызвать функцию print_hello().

Просто замените print_hello() на открытую или закрытую функцию в соответствующем вызове кнопки открытия или закрытия.

EDIT: Передача параметров в функции

обработчик сигналов, как ожидается, прототип формы:

void signal_handler (GtkButton *button, void *user_data) 

Параметр button получает кнопку, которая была нажата, и user_data получает независимо от того, что вы указали как последний параметр g_signal_connect() - в этом случае NULL.

Если вы хотите передать параметры вашего открытия или закрытия функции, вам придется написать функцию адаптера, например, следующее:

void 
on_open_click (GtkButton *open_button, void *user_data) 
{ 
    if (my_open_function (my_parameter_1, my_parameter_2) == UH_OH_ERROR) { 
     fprintf(stderr, "Something went wrong.\n"); 
} 

А затем соединить его с g_signal_connect() вместо print_hello:

g_signal_connect (button, "clicked", G_CALLBACK (on_open_click), NULL); 

В этом случае my_parameter_1 и my_parameter_2 могут быть литеральными или глобальными. Вы также можете подключить сигнал таким образом, чтобы вы могли получать значения для этих параметров через параметр user_data в вашем обработчике сигналов. Трудно сказать, нужно ли вам это делать, не зная больше о ваших открытых и закрытых функциях.

+0

моя открытая функция имеет два параметра, которые определены в другом файле c – ganeshredcobra

+0

См. Редактирование ответа. – ptomato

Смежные вопросы