GTK:无限的惰性小部件列表

Posted

技术标签:

【中文标题】GTK:无限的惰性小部件列表【英文标题】:GTK: Infinite lazy list of widgets 【发布时间】:2012-02-20 23:32:25 【问题描述】:

我需要显示一个几乎无限滚动的交互式小部件列表,并在添加新数据或用户滚动到未缓存区域时根据需要添加/删除它们。

TreeView (as asked about here) 不是选项,因为我需要完整的小部件作为项目(由具有多个操作等的标准小部件组成,但 CellRenderer 不适合此)

更糟糕的是,我事先不知道小部件的高度(虽然变化不大),所以使用 VBox 可能会导致跳跃。

使用滚动条应该仍然感觉好像列表是有限的(即仅在滚动完成后更新,因此滚动按钮不会从您的鼠标上跳开),并且在调整窗口大小和更新窗口布局时,滚动位置不应该改变太多(焦点小部件应该保持在原来的位置,除非当然焦点小部件被滚动了......)。

最好的方法是什么?甚至当需要添加新的小部件时,它甚至可能只是向我发送信号的库?

或者可以强制 ListView 以不太讨厌的方式执行此操作? (即在屏幕外缓冲区上绘制,使用 CellRenderer 将其复制到单元格中,将鼠标/键盘事件中继到实际小部件?)

【问题讨论】:

“跳跃”是什么意思? VBox 有什么问题? 如果用户向上滚动,则小部件的平均高度为 200 像素(即,我有许多 200 像素高的空白单元格,我视需要替换为实际的小部件),但我添加了一个 250 像素的单元格在顶部,一切看起来都会向下跳 50px。所以我猜 VBox 必须放置在 Fixed 中并向上移动 50px 以防止这种情况发生,但是它不会再被拉伸到 ScrollWindow 的大小...... 您可以尝试手动滚动到当前小部件。 是的,但我认为这会与用户交互发生冲突:当滚动条被抓住并向上推动时(因此必须添加新的小部件),如果它突然跳下会感觉很奇怪。所以我必须移动小部件的容器。或者创建一个可以具有隐藏偏移的调整适配器。也许根本不使用滚动条,而是像 Google Wave 那样使用慢速拨盘? (已经有一个很好的小部件了吗?) 如果您只想将列表扩展到底部,那么您可以在用户停止滚动足够接近底部时添加新的小部件。要求非常复杂:当用户向下拖动滚动条时,您不希望滚动条跳动,但如果用户按住滚动条等待数据加载,它应该加载。如果您要在顶部和底部添加数据,我认为滚动条效果不佳。也许列表上方和下方的程式化箭头? (确保在任何一种情况下都处理鼠标滚轮事件) 【参考方案1】:

如果它是一个无限列表,那么您不应该尝试使用滚动条来实现任何目标 - 这仅适用于有限列表。

我的建议是使用带有 2 个按钮的叠加层

+------------+
| UP ARROW   |
+------------+
| ITEM  N    |
| ITEM  N+1  |
| ITEM  N+2  |
+------------+
| DOWN ARROW |
+------------+

对于按钮之间的列表,您可能必须自己实现一个自定义容器小部件。 我建议提前在每个方向缓冲 n (>=2) 个小部件/项目。

与自定义容器无关,而是自定义小部件 - 一个起点

http://zetcode.com/tutorials/cairographicstutorial/customgtkwidget/

http://gnomejournal.org/article/34/writing-a-widget-using-cairo-and-gtk28

http://old.nabble.com/Custom-container-%2B-Child-type-with-interface-td26863728.html

【讨论】:

以上是关于GTK:无限的惰性小部件列表的主要内容,如果未能解决你的问题,请参考以下文章

Gtk3用另一个小部件替换子小部件

在 Gtk+ 中堆叠小部件

用于建议的 Gtk 小部件

如何更改 GTK 容器小部件的大小?

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

GTKmm - 无法将固定大小设置为 Gtk::Scale 小部件