GtkGrid 没有显示附加到它的新小部件

Pet*_*jak 3 c c++ gtk

我决定制作一个玩具应用程序,在其中通过向 GtkGrid 添加元素的行/列来调整标签表的大小。

\n\n

当从按钮回调函数内部向 GtkGrid 添加新元素时,网格小部件会更新其大小,但无法更新内容。

\n\n
#include <gtk/gtk.h>\n\nstatic void kaboom(GtkWidget*, gpointer);\nstatic void minusVert(GtkWidget*, gpointer);\nstatic void plusVert(GtkWidget*, gpointer);\n\nstatic int x = 1;\nstatic int y = 1;\n\nint main(int argc, char** argv) {\n    GtkWidget* window, *subs, *buts, *grid, *button;\n\n    gtk_init(&argc, &argv);\n\n    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);\n    gtk_window_set_title(GTK_WINDOW(window), "Playground!!");\n    gtk_widget_set_size_request(window, 200, 50);\n\n    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(kaboom), NULL);\n\n    subs = gtk_paned_new(GTK_ORIENTATION_VERTICAL);\n    gtk_container_add(GTK_CONTAINER(window), subs);\n\n    grid = gtk_grid_new();\n    gtk_paned_pack1(GTK_PANED(subs), grid, true, false);\n\n    gtk_grid_set_row_homogeneous(GTK_GRID(grid), true);\n    gtk_grid_set_column_homogeneous(GTK_GRID(grid), true);\n\n    gtk_grid_attach(GTK_GRID(grid), gtk_label_new("\xc3\x97"), 0, 0, 1, 1);\n\n    buts = gtk_grid_new();\n    gtk_paned_pack2(GTK_PANED(subs), buts, false, false);\n\n    gtk_grid_set_row_homogeneous(GTK_GRID(grid), true);\n    gtk_grid_set_column_homogeneous(GTK_GRID(buts), true);\n\n    gtk_grid_attach(GTK_GRID(buts), gtk_label_new("Vertical"), 0, 0, 2, 1);\n\n    button = gtk_button_new_with_label("-");\n    g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(minusVert), grid);\n    gtk_grid_attach(GTK_GRID(buts), button, 0, 1, 1, 1);\n\n    button = gtk_button_new_with_label("+");\n    g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(plusVert), grid);\n    gtk_grid_attach(GTK_GRID(buts), button, 1, 1, 1, 1);\n\n    gtk_grid_attach(GTK_GRID(buts), gtk_label_new("Horizontal"), 2, 0, 2, 1);\n\n    button = gtk_button_new_with_label("-");\n    gtk_grid_attach(GTK_GRID(buts), button, 2, 1, 1, 1);\n\n    button = gtk_button_new_with_label("+");\n    gtk_grid_attach(GTK_GRID(buts), button, 3, 1, 1, 1);\n\n    gtk_widget_show_all(window);\n\n    gtk_main();\n\n    return 0;\n}\n\nstatic void kaboom(GtkWidget* window, gpointer data) {\n    gtk_main_quit();\n}\n\nstatic void minusVert(GtkWidget *button, gpointer data) {\n    if (y > 1) {\n        // Remove all the elems in the last row\n        for (int i = 0; i < x; ++i) {\n            gtk_widget_destroy(gtk_grid_get_child_at(GTK_GRID(data), i, y - 1));\n        }\n        --y;\n    }\n}\n\nstatic void plusVert(GtkWidget *button, gpointer data) {\n    for (int i = 0; i < x; ++i) {\n        // Add the new row\n        gtk_grid_attach(GTK_GRID(data), gtk_label_new("\xc3\x97"), i, y, 1, 1);\n    }\n    ++y;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

之前和之后的截图:

\n\n

之前和之后的截图

\n\n

我的问题是:如何将新标签附加到GtkGrid可见内容上?

\n\n

注:我正在使用 C++,但不是 GTKmm,因为我正在阅读一本为 GTK+ 编写的书。即使移植到纯 C,应用程序的行为也是一样的。

\n

gpo*_*poo 5

当您创建小部件时,默认情况下不会显示这些小部件。你必须告诉他们这样做。您可以更改回调,plusVert例如:

\n\n
static void plusVert(GtkWidget *button, gpointer data) {\n  for (int i = 0; i < x; ++i) {\n    GtkWidget *label = gtk_label_new("\xc3\x97");\n    gtk_grid_attach(GTK_GRID(data), label, i, y, 1, 1);\n    gtk_widget_show(label);\n  }\n  ++y;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

请参阅gtk_widget_show()

\n