如何从 gtk_container_get_children 获取按钮标签
How to get button label from gtk_container_get_children
我的 window 中有一组按钮,我希望能够单击任何一个按钮,调用 button_clicked 函数并获取其中每个按钮的标签阵列。
我想我已经设法获取了按钮的容器,然后又在该容器中获取了子项,但我不确定如何遍历每个按钮并因此获取标签。
有什么办法吗?
#include <gtk/gtk.h>
#include <stdint.h>
void button_clicked(GtkButton *widget, gpointer data) {
GtkWidget * parent = gtk_widget_get_parent((GtkWidget*)widget);
GList *children = gtk_container_get_children(GTK_CONTAINER(parent));
printf("%p\n", children->data);
}
int main(int argc, char *argv[]) {
GtkWidget *window;
GtkWidget *fixed;
gchar *values[9] = {"1","2","3","4","5","6","7","8","9"};
char game_data[4] = "ZZ";
GtkWidget *button[9];
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Tic Tac Toe");
gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
fixed = gtk_fixed_new();
gtk_container_add(GTK_CONTAINER(window), fixed);
for (int row = 0; row < 9; row+=3){
for (int column = 0; column < 3; column++){
button[row+column] = gtk_button_new_with_label(values[row+column]);
gtk_fixed_put(GTK_FIXED(fixed), button[row+column], column*70, row*30);
gtk_widget_set_size_request(button[row+column], 50, 50);
g_signal_connect(G_OBJECT(button[row+column]), "clicked", G_CALLBACK(button_clicked), (gpointer)(game_data));
}
}
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
好的,像这样:
static void button_clicked(GtkButton *widget, gpointer data)
{
GtkWidget * const parent = gtk_widget_get_parent(GTK_WIDGET(widget));
GList *children = gtk_container_get_children(GTK_CONTAINER(parent));
for (const GList *iter = children; iter != NULL; iter = g_list_next(iter))
{
const GtkWidget * const lbl = gtk_bin_get_child(GTK_BIN(iter->data));
const char * const text = gtk_label_get_text(GTK_LABEL(lbl));
printf("'%s'\n", text);
}
}
重点是按钮是一个容器,更具体地说是一个容器。因此,只需向垃圾箱询问其 child,并假设这是标签。
我的 window 中有一组按钮,我希望能够单击任何一个按钮,调用 button_clicked 函数并获取其中每个按钮的标签阵列。
我想我已经设法获取了按钮的容器,然后又在该容器中获取了子项,但我不确定如何遍历每个按钮并因此获取标签。
有什么办法吗?
#include <gtk/gtk.h>
#include <stdint.h>
void button_clicked(GtkButton *widget, gpointer data) {
GtkWidget * parent = gtk_widget_get_parent((GtkWidget*)widget);
GList *children = gtk_container_get_children(GTK_CONTAINER(parent));
printf("%p\n", children->data);
}
int main(int argc, char *argv[]) {
GtkWidget *window;
GtkWidget *fixed;
gchar *values[9] = {"1","2","3","4","5","6","7","8","9"};
char game_data[4] = "ZZ";
GtkWidget *button[9];
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Tic Tac Toe");
gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
fixed = gtk_fixed_new();
gtk_container_add(GTK_CONTAINER(window), fixed);
for (int row = 0; row < 9; row+=3){
for (int column = 0; column < 3; column++){
button[row+column] = gtk_button_new_with_label(values[row+column]);
gtk_fixed_put(GTK_FIXED(fixed), button[row+column], column*70, row*30);
gtk_widget_set_size_request(button[row+column], 50, 50);
g_signal_connect(G_OBJECT(button[row+column]), "clicked", G_CALLBACK(button_clicked), (gpointer)(game_data));
}
}
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
好的,像这样:
static void button_clicked(GtkButton *widget, gpointer data)
{
GtkWidget * const parent = gtk_widget_get_parent(GTK_WIDGET(widget));
GList *children = gtk_container_get_children(GTK_CONTAINER(parent));
for (const GList *iter = children; iter != NULL; iter = g_list_next(iter))
{
const GtkWidget * const lbl = gtk_bin_get_child(GTK_BIN(iter->data));
const char * const text = gtk_label_get_text(GTK_LABEL(lbl));
printf("'%s'\n", text);
}
}
重点是按钮是一个容器,更具体地说是一个容器。因此,只需向垃圾箱询问其 child,并假设这是标签。