Я решил создать игрушечное приложение, в котором я изменяю размер таблицы меток, добавляя строки/столбцы элементов в GtkGrid.GtkGrid не показывает новые виджеты, прикрепленные к нему
При добавлении нового элемента в GtkGrid изнутри функции обратного вызова кнопки виджет сетки обновляет свой размер, но не обновляет содержимое.
#include <gtk/gtk.h>
static void kaboom(GtkWidget*, gpointer);
static void minusVert(GtkWidget*, gpointer);
static void plusVert(GtkWidget*, gpointer);
static int x = 1;
static int y = 1;
int main(int argc, char** argv) {
GtkWidget* window, *subs, *buts, *grid, *button;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Playground!!");
gtk_widget_set_size_request(window, 200, 50);
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(kaboom), NULL);
subs = gtk_paned_new(GTK_ORIENTATION_VERTICAL);
gtk_container_add(GTK_CONTAINER(window), subs);
grid = gtk_grid_new();
gtk_paned_pack1(GTK_PANED(subs), grid, true, false);
gtk_grid_set_row_homogeneous(GTK_GRID(grid), true);
gtk_grid_set_column_homogeneous(GTK_GRID(grid), true);
gtk_grid_attach(GTK_GRID(grid), gtk_label_new("×"), 0, 0, 1, 1);
buts = gtk_grid_new();
gtk_paned_pack2(GTK_PANED(subs), buts, false, false);
gtk_grid_set_row_homogeneous(GTK_GRID(grid), true);
gtk_grid_set_column_homogeneous(GTK_GRID(buts), true);
gtk_grid_attach(GTK_GRID(buts), gtk_label_new("Vertical"), 0, 0, 2, 1);
button = gtk_button_new_with_label("-");
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(minusVert), grid);
gtk_grid_attach(GTK_GRID(buts), button, 0, 1, 1, 1);
button = gtk_button_new_with_label("+");
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(plusVert), grid);
gtk_grid_attach(GTK_GRID(buts), button, 1, 1, 1, 1);
gtk_grid_attach(GTK_GRID(buts), gtk_label_new("Horizontal"), 2, 0, 2, 1);
button = gtk_button_new_with_label("-");
gtk_grid_attach(GTK_GRID(buts), button, 2, 1, 1, 1);
button = gtk_button_new_with_label("+");
gtk_grid_attach(GTK_GRID(buts), button, 3, 1, 1, 1);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
static void kaboom(GtkWidget* window, gpointer data) {
gtk_main_quit();
}
static void minusVert(GtkWidget *button, gpointer data) {
if (y > 1) {
// Remove all the elems in the last row
for (int i = 0; i < x; ++i) {
gtk_widget_destroy(gtk_grid_get_child_at(GTK_GRID(data), i, y - 1));
}
--y;
}
}
static void plusVert(GtkWidget *button, gpointer data) {
for (int i = 0; i < x; ++i) {
// Add the new row
gtk_grid_attach(GTK_GRID(data), gtk_label_new("×"), i, y, 1, 1);
}
++y;
}
скриншоты до и после:
Мой вопрос: как я могу сделать новые этикетки, прикрепленные к GtkGrid
видимым?
Примечания: Я использую C++, но не GTKmm, потому что я работаю над книгой, написанной для GTK +. Даже если портировать на чистый C, приложение ведет себя одинаково.
В чем вопрос/проблема? Что вы пробовали и какие результаты у вас были до сих пор? –
@SimonMartin Похоже, мой оригинальный пост был действительно неуклюже собран. Сожалею. –