0

我有一个 main.c,它与一些头文件和其他 c 文件链接。完成程序后,它是一个基于终端的程序,它使用 switch 与用户输入一起工作。当我给出“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.

如果要将参数传递给打开或关闭函数,则必须编写一个适配器函数,如下所示:

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信号处理程序中的参数获取这些参数的值的方式连接信号。如果不了解更多关于您的打开和关闭功能,很难说您是否需要这样做。

于 2013-09-30T06:41:56.307 回答