我正在做一个练习,其中有一个按钮、一个条目、一个框和一个标签。该按钮必须调用一个函数来创建标签并为其提供条目输入。最后,该函数必须将标签添加到框中并在窗口中显示标签。 如何在不使用任何全局指针的情况下将标签指针、框指针和入口指针赋予回调函数?
#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;
}
虽然有点棘手,但很有效。
您将盒子交给回调函数。然后确定子 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;
}