【问题标题】:Creating a a grid of uniform, square buttons in gtk4在 gtk4 中创建一个统一的方形按钮网格
【发布时间】:2021-06-10 07:01:12
【问题描述】:

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

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

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

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

  1. 使用 GtkGrid,每个孩子都包含一个 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 中实现这种行为?

【问题讨论】:

  • 我对 GTK4 本身并不熟悉,但我认为对于您想要实现的目标,您必须深入创建自己的控件的兔子洞。我可能会使用绘图区域或画布来实现这一点,您可以在其中控制您绘制的网格的所有细节。您将不得不听鼠标和键盘事件,但在您的示例中,命中测试应该很容易。使用标准控件,我猜你会很快达到限制。此外,从概念上讲,您的网格项目不是您按下的按钮或您可以编辑的单元格,因此使用这些感觉有点不妥。

标签: c gtk gtk4


【解决方案1】:

您可以使用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>

【讨论】:

  • 我在林间空地试过这个。据我所知,这可以确保所有单元格具有相同的高度和宽度,但不能保证高度 = 宽度。
猜你喜欢
  • 1970-01-01
  • 2019-11-10
  • 2018-01-17
  • 2023-04-11
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
相关资源
最近更新 更多