如何控制在树的展开行中可见哪些 GTK 小部件?

Posted

技术标签:

【中文标题】如何控制在树的展开行中可见哪些 GTK 小部件?【英文标题】:How to control which GTK widgets visible in an expanded row of a tree? 【发布时间】:2019-04-06 09:53:51 【问题描述】:

我正在用 C 语言中的 GTK3 构建一个树形存储,其中始终显示主要行,通过单击主要行左侧的小三角形图标,额外的辅助(子)行在下方展开基本的。例如,考虑主行可能是目录,当它们展开时,下面的行显示这些目录中的文件。我这样做是为了允许用户选择要删除的主要项目,而次要行只是提供信息,例如告诉目录中有哪些文件,这样他们就会知道他们是否真的要删除整个东西。

要启用删除选择,第一列包含一个 GTK_CELL_RENDERER_TOGGLE,我有一个与复选框切换关联的回调。除了一件事,一切都很好。当用户单击小三角形项以展开一行时,主要行的大部分内容不会出现在次要行中(这是预期的和期望的),但是...复选框切换确实 出现在第一列。尽管在目录/文件示例中可能有意义,但在我的情况下,考虑删除辅助行的内容是没有意义的。

在构建辅助行时,我尝试了以下方法:

gtk_tree_store_set(TS,&J,2,"filename",-1);

gtk_tree_store_set(TS,&J,0,NULL,2,"filename",-1);

希望 NULL 会导致切换被抑制,但无济于事。 GTK 仍然显示一个复选框,可能只是将 NULL 解释为零。

有没有办法控制(在我的情况下,抑制)切换的显示?或者更一般地说,是否有一种干净的方法来控制子行中显示哪些列?它似乎适用于 TEXT,但不适用于 TOGGLE。

稍后:有一个潜在有用的函数称为 gtk_cell_renderer_set_visible(),但它需要引用单元格渲染器。当我在构建过程中只有 GtkTreeStore 和 GtkTreeIter 时,如何逐行或逐单元获取它?

【问题讨论】:

请用最少的工作代码示例编辑问题,这将大大增加您获得所需帮助的机会。 【参考方案1】:

有(至少)2个解决方案:

    基类GtkCellRenderer 具有visible 属性。您可以向模型添加额外的字段,以指示此行是否应显示 Toggle。 如果您的模型中有 other 字段指示它是主行还是辅助行但不是直接的,您可以使用gtk_tree_view_column_set_cell_data_func 设置要在渲染之前调用的函数。在那里您可以调用gtk_cell_renderer_set_visible 或任何其他函数来手动设置渲染器的属性。

【讨论】:

以上是关于如何控制在树的展开行中可见哪些 GTK 小部件?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改按钮单击 GTK c 上的多个小部件属性

在 Gtk+ 中堆叠小部件

如何在 Qt 中制作可展开/可折叠的部分小部件

如何访问存储在 Gtk::Box / Gtk::Grid 中的 [i] 处的小部件?

如何在 GTK 中更新(绘制)一个小部件和仅这个小部件

如何计算存储在 Gtk::Grid 中的小部件?