在 gtk4 中创建一个统一的方形按钮网格

问题描述

正如标题所说,我想在 gtk4 中创建一个由统一的方形按钮组成的网格,单元格之间没有(或很少)间距。看起来这应该很简单,但我一直在努力在 gtk 中实现这一目标。

这是我尝试复制的示例的图片range chart

这适用于与扑克相关的应用程序。这种图表在扑克软件中极为常见。用户应该能够选择任何单元格子集,每个单元格代表一手牌。该子集(或称为“范围”)随后可以由程序以各种方式进行处理。

到目前为止,我的(失败)尝试包括

  1. 将 GtkGrid 与每个包含 GtkAspectFrame 的子项一起使用,其中 GtkAspectFrame 包含一个 GtkToggleButton。 image

这种方法奏效了,但我在单元格之间留下了可怕的间隙,我不知道如何摆脱。另外,当我运行程序时,GTK 会吐出一堆看起来像这样的错误消息:

(window:29202): Gtk-CRITICAL **: 11:07:39.057: Allocation width too small. Tried to allocate 34x34,but GtkToggleButton 0x564febf98c10 needs at least 36x34.

  1. 使用具有 13 个 G_TYPE_STRING 列(每张卡片一个)的 GtkListStore。然后我手动将 13 行中的每一行添加到列表存储中,并使用 GtkCellRendererText 将其显示为 GtkTreeView。 image

我能够显示文本,但仅此而已。 GtkTreeView 似乎比面向单元格更面向行/列。似乎没有办法选择单个单元格,而且似乎没有办法在认情况下添加按钮。也许我可以用一堆自定义事件/信号实现自定义 GtkCellRenderer?这似乎是一个相当大的兔子洞,所以我想看看我是否可以先获得一些指导。

除了最基本的实现之外,我最终希望每个单元格都能够具有不一定始终显示的关联数据。我相信这表明 GtkTreeView 是正确的方法,如果有办法让它正常工作。

你可能会说,我对 Gtk 很陌生。我只玩了几天,试图理解文档并让它发挥作用。这里的正确方法是什么?任何为我指明正确方向的提示将不胜感激。


作为奖励:通常,精心设计的扑克应用程序将允许您将鼠标悬停在 按住鼠标按钮的单元格以选择您的范围。按住鼠标按钮时光标下的任何单元格都将添加到选择中。这通常比单击每个单独的单元格更方便。如何在 gtk4 中实现这种行为?

解决方法

您可以使用 GtkGrid 并设置 row-homogeneouscolumn-homogeneous 属性。它将使所有单元格分别与最大的孩子具有相同的高度/宽度。

GtkWidget *grid = gtk_grid_new();
gtk_grid_set_row_homogeneous (GTK_GRID (grid),TRUE);
gtk_grid_set_column_homogeneous (GTK_GRID (grid),TRUE);

// Then just attach your button using the usual APIs:
// gtk_grid_attach (GTK_GRID (grid),button,1,1);

或在 GtkBuilder XML 中

<object class="GtkGrid" id="grid">
    <property name="row-homogeneous">1</property>
    <property name="column-homogeneous">1</property>
    <child>
        <object class="GtkToggleButton">
            <!-- initialize your toggle button -->
        </object>
        <layout> 
            <property name="column">0</property>
            <property name="row">0</property>
        </layout>
    </child>
    <!-- And so on ... -->
</object>