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

标签 c++ c gtk

我决定制作一个玩具应用程序,通过向 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;
}

前后截图:

The screenshots before and after

我的问题是:如何使附加到 GtkGrid 的新标签可见?

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

最佳答案

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

static void plusVert(GtkWidget *button, gpointer data) {
  for (int i = 0; i < x; ++i) {
    GtkWidget *label = gtk_label_new("×");
    gtk_grid_attach(GTK_GRID(data), label, i, y, 1, 1);
    gtk_widget_show(label);
  }
  ++y;
}

参见 gtk_widget_show() .

关于c++ - GtkGrid 没有显示附加到它的新小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15116828/

相关文章:

c - GTK2 C - 如何将二维结构数组传递给回调函数并更改该数组的值?

c++ - Qt 非静态链接和 .pro 文件

c++ - 我想为在树下选择的任何 child 获取树结构的完整路径。有没有可以使用的直接API?

c# - 如何将用 c/c++ 编写的 exe 引用到 c# 项目?

c - 如何? - 彩票模拟(C)

c - 'C' 显示为 2 个不同的值?

gtk - 如何使用 Vala 从字符串生成二维码图像?

python - 无法替换序列化 TextView 中的数据,字节数组大小问题?

c++ - 在 std::getline() 上使用任何字符作为分隔符

c - 二进制文件读取,将2个字节转换为一个unsigned short C