首页 > 解决方案 > 如何控制在树的展开行中可见哪些 GTK 小部件?

问题描述

我正在用 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 时,如何在每行或每单元的基础上获取它?

标签: treeviewgtkgtk3togglebutton

解决方案


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

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

推荐阅读