如何控制在树的展开行中可见哪些 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 小部件?的主要内容,如果未能解决你的问题,请参考以下文章