使用 g_signal_connect GTK4 获取参数

问题描述 投票:0回答:1

我正在做一个练习,其中有一个按钮、一个条目、一个框和一个标签。该按钮必须调用一个函数来创建标签并为其提供条目输入。最后,该函数必须将标签添加到框中并在窗口中显示标签。 如何在不使用任何全局指针的情况下将标签指针、框指针和入口指针赋予回调函数?

#include <gtk/gtk.h>

static void print(GtkApplication *app, gpointer user_data)
{
}

static void activate(GtkApplication *app, gpointer user_data)
{
    GtkWidget *window;
    GtkWidget *box;
    GtkWidget *label;
    GtkWidget *button;
    GtkWidget *entry;
    

    window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "Window");
    gtk_window_set_default_size(GTK_WINDOW(window), 400, 400);

    box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
    gtk_widget_set_halign(box, GTK_ALIGN_CENTER);
    gtk_widget_set_valign(box, GTK_ALIGN_CENTER);
    gtk_window_set_child(GTK_WINDOW(window), box);

    label = gtk_label_new("il bottone sotto non fa nulla");
    gtk_box_append(GTK_BOX(box), label);

    button = gtk_button_new_with_label("Button 1");
    g_signal_connect(button, "clicked", G_CALLBACK(print), NULL);
    gtk_box_append(GTK_BOX(box), button);

    entry = gtk_entry_new();
    gtk_box_append(GTK_BOX(box), entry);



    gtk_window_present(GTK_WINDOW(window));
}

int main(int argc, char **argv)
{
    GtkApplication *app;
    int status;

    app = gtk_application_new("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
    status = g_application_run(G_APPLICATION(app), argc, argv);
    g_object_unref(app);

    return status;
}

c gtk gtk4
1个回答
0
投票

虽然有点棘手,但很有效。

您将盒子交给回调函数。然后确定子 GtkEntry。您阅读内容并使用该标签创建一个新标签并将其添加到盒子中。祝你练习愉快。

#include<gtk/gtk.h>

static void print(GtkApplication *app, gpointer user_data)
{
    GtkWidget *child;
    for(child = gtk_widget_get_first_child(GTK_WIDGET(user_data));
            child != NULL;
            child = gtk_widget_get_next_sibling(child))
    {
        if (strcmp(gtk_widget_get_name(child),"GtkEntry") == 0)
        {
            GtkWidget *label_2 = gtk_label_new(gtk_editable_get_text(GTK_EDITABLE(child)));
                gtk_box_append(GTK_BOX(user_data),label_2);
        }
    }
}

static void activate(GtkApplication *app, gpointer user_data)
{
    GtkWidget *window;
    GtkWidget *box;
    GtkWidget *label;
    GtkWidget *button;
    GtkWidget *entry;


    window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "Window");
    gtk_window_set_default_size(GTK_WINDOW(window), 400, 400);

    box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
    gtk_widget_set_halign(box, GTK_ALIGN_CENTER);
    gtk_widget_set_valign(box, GTK_ALIGN_CENTER);
    gtk_window_set_child(GTK_WINDOW(window), box);

    label = gtk_label_new("il bottone sotto non fa nulla");
    gtk_box_append(GTK_BOX(box), label);

    button = gtk_button_new_with_label("Button 1");
    g_signal_connect(button, "clicked", G_CALLBACK(print), box);
    gtk_box_append(GTK_BOX(box), button);

    entry = gtk_entry_new();
    gtk_box_append(GTK_BOX(box), entry);



    gtk_window_present(GTK_WINDOW(window));
}

int main(int argc, char **argv)
{
    GtkApplication *app;
    int status;

    app = gtk_application_new("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
    status = g_application_run(G_APPLICATION(app), argc, argv);
    g_object_unref(app);

    return status;
}

© www.soinside.com 2019 - 2024. All rights reserved.