0

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

这是我要复制的示例的图片:range chart

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

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

  1. 对每个包含 GtkAspectFrame 的子项使用 GtkGrid,其中包含 GtkToggleButton。图片

这种方法奏效了,但我在细胞之间留下了可怕的间隙,我不知道如何摆脱。另外,当我运行程序时,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。图片

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

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

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


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

4

1 回答 1

0

您可以使用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, 0, 0, 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>
于 2021-06-10T12:48:50.367 回答