Как получить метку кнопки от gtk_container_get_children - PullRequest
1 голос
/ 27 января 2020

У меня есть массив кнопок в моем окне, и я хотел бы иметь возможность нажимать на любую из кнопок, вызывать функцию 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;
}

1 Ответ

2 голосов
/ 27 января 2020

Хорошо, что-то вроде этого:

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);
  }
}

Дело в том, что кнопка - это контейнер, а корзина должна быть более точной c. Так что просто спросите корзину для ее дочернего элемента и предположите, что это метка.

...