阅读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
的定义。
答案 0 :(得分:1)
列和行仍然按像素间隔,但由于列是同质的,因此还会添加额外的空间。 (查看您对gtk_table_new()
的调用 - TRUE
作为homogeneous
参数传递。)
这意味着每列的宽度和高度等于任何列的最大宽度和高度。即使没有任何行间距或柱间距,这也会弄乱您的间距。因此,网格在ASCII-art中看起来像这样:
+----------------------------------+
|Enter the following information...|
+-----+----------------------------+
|Name:|[ ]|
+-----+----------------------------+
(请注意,Entry设置为水平扩展,假设它的最小大小为ASCII-art中的20个空格)
但表格是同质的,因此每列都采用最宽列的宽度。最宽的小部件是顶部标签,但是它被拉伸到两列;所以Entry赢了。该表变为:
+-----------------------------------------+
| Enter the following information... |
+--------------------+--------------------+
| Name: |[ ]|
+--------------------+--------------------+
(标签在他们的牢房中居中,确实产生了非常有趣的间距。)