0

いくつかのヘッダーと他の c ファイルにリンクされている main.c があります。プログラムを完了した後、スイッチを使用してユーザー入力で動作する端末ベースのプログラムです。「o」を指定すると、ハードウェア ボードに関連付けられ、「 c」で閉じます。

c で書かれた GTK+ の GUI コードのサンプルを入手しました。開くボタンと閉じるボタンを備えています。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;
}
4

1 に答える 1

1

ラインで

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

「シグナルハンドラー」を「接続」しています。buttonがクリックされたとき(つまり、"clicked"シグナルを発したとき)に関数print_hello()が呼び出されるように指定します。

print_hello()開くボタンまたは閉じるボタンの適切な呼び出しで、開く関数または閉じる関数に置き換えるだけです。

編集:関数にパラメーターを渡す

シグナル ハンドラーには、次の形式のプロトタイプが必要です。

void signal_handler (GtkButton *button, void *user_data)

このbuttonパラメーターは、クリックされたボタンを取得user_dataし、最後のパラメーターとして指定したものをすべて取得しますg_signal_connect()-- この場合はNULL.

open 関数または close 関数にパラメーターを渡したい場合は、次のようなアダプター関数を作成する必要があります。

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_1andmy_parameter_2はリテラル値またはグローバル変数にすることができます。user_dataシグナル ハンドラーのパラメーターを介してこれらのパラメーターの値を取得できるように、シグナルを接続することもできます。open 関数と close 関数について詳しく知らなければ、それを行う必要があるかどうかを判断するのは困難です。

于 2013-09-30T06:41:56.307 に答える