gtk_grid_set_row_spacing vs gtk_table_set_row_spacings

时间:2014-01-26 23:12:59

标签: c gtk

阅读GTK Book,在确保学习以GTK3为中心的技能时,有很多事情需要清理。一个是表格与网格。我的问题是关于这两个小部件的set_spacing函数。

GTK docs表示gtk_table_set_row_spacings()的第二个参数以像素为单位。但是,gtk_grid_set_row_spacing()的{​​{3}}没有给出第二个参数的度量单位。设置两个小部件的列间距也是如此。

这是否有任何问题的唯一原因(除了显式更好?)是你必须使用非常不同的数字来创建表和网格之间相同的美学。因此,如果网格没有按像素间隔,那么 它们间隔的是什么?

编辑:

这是我输入的教程代码。

#include <gtk/gtk.h>

int main(int argc, char *argv[])
{
    GtkWidget *window, *table, *label, *label2, *name;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "Tables");
    gtk_container_set_border_width(GTK_CONTAINER(window), 10);

    g_signal_connect(window, "destroy", gtk_main_quit, NULL);

    //table = gtk_table_new(2, 2, TRUE);
    table = gtk_grid_new();

    label = gtk_label_new("Enter the following information...");
    label2 = gtk_label_new("Name: ");

    name = gtk_entry_new();

    //gtk_table_attach(GTK_TABLE(table), label,  0, 2, 0, 1, GTK_EXPAND, GTK_SHRINK, 0, 0);
    //gtk_table_attach(GTK_TABLE(table), label2, 0, 1, 1, 2, GTK_EXPAND, GTK_SHRINK, 0, 0);
    //gtk_table_attach(GTK_TABLE(table), name,   1, 2, 1, 2, GTK_EXPAND, GTK_SHRINK, 0, 0);

    gtk_grid_attach(GTK_GRID(table), label,  0, 0, 2, 1);
    gtk_grid_attach(GTK_GRID(table), label2, 0, 1, 1, 1);
    gtk_grid_attach(GTK_GRID(table), name,   1, 1, 1, 1);

    //gtk_table_set_row_spacings(GTK_TABLE(table), 5);
    //gtk_table_set_col_spacings(GTK_TABLE(table), 5);

    gtk_grid_set_column_spacing(GTK_GRID(table), 5);
    gtk_grid_set_row_spacing(GTK_GRID(table), 5);

    gtk_container_add(GTK_CONTAINER(window), table);
    gtk_widget_show_all(window);

    gtk_main();
    return 0;
}

这两者产生了截然不同的结果。我唯一的猜测是,如果网格和表格都是像素填充的,那么我就误解了在转换代码时如何布局网格和表格。

作为参考,使用以下Makefile编译:

BINS         = $(basename $(wildcard *.c))
CC           = gcc
CFLAGS      += -Wall -Wextra -std=c11
GTK_DFLAGS   = -DGTK_DISABLE_SINGLE_INCLUDES -DGDK_DISABLE_DEPRECATED -DGSEAL_ENABLE
GTK_CFLAGS  := $(shell pkg-config --cflags gtk+-3.0)
GTK_LDFLAGS := $(shell pkg-config --libs gtk+-3.0)

all:
        $(MAKE) $(BINS)

%: %.c
        $(CC) $(CFLAGS) $(GTK_DFLAGS) $(GTK_CFLAGS) $(GTK_LDFLAGS) -o $@ $@.c

.PHONY: clean

clean:
        rm -f $(BINS) *~

我为要编译的表格版本注释了$GTK_DFLAGS的定义。

1 个答案:

答案 0 :(得分:1)

列和行仍然按像素间隔,但由于列是同质的,因此还会添加额外的空间。 (查看您对gtk_table_new()的调用 - TRUE作为homogeneous参数传递。)

这意味着每列的宽度和高度等于任何列的最大宽度和高度。即使没有任何行间距或柱间距,这也会弄乱您的间距。因此,网格在ASCII-art中看起来像这样:

+----------------------------------+
|Enter the following information...|
+-----+----------------------------+
|Name:|[                          ]|
+-----+----------------------------+

(请注意,Entry设置为水平扩展,假设它的最小大小为ASCII-art中的20个空格)

但表格是同质的,因此每列都采用最宽列的宽度。最宽的小部件是顶部标签,但是它被拉伸到两列;所以Entry赢了。该表变为:

+-----------------------------------------+
|    Enter the following information...   |
+--------------------+--------------------+
|       Name:        |[                  ]|
+--------------------+--------------------+

(标签在他们的牢房中居中,确实产生了非常有趣的间距。)