在 Gtk ScrolledWindow 中滚动时我应该捕捉哪些信号?

Posted

技术标签:

【中文标题】在 Gtk ScrolledWindow 中滚动时我应该捕捉哪些信号?【英文标题】:What signals should I catch when scrolling in a Gtk ScrolledWindow? 【发布时间】:2012-10-29 06:54:44 【问题描述】:

我正在为 Rhythmbox 开发一个 python 插件——它包含一个 GtkScrolledWindow 和一个子 GtkIconView。 IconView 由 Gtk.TreeModel 提供。

看起来像这样:

目前 - 并且有些低效,每个图标都是为树模型中的每一行绘制的 - 每个图标都是来自文件的 GdkPixbuf。如果您有数千行,则整个图标视图可能需要很长时间才能完全更新为每个图片图标。

我想要实现的是只更新当前绘图区域中的图标 - 当用户滚动并释放滚动条(或通过键盘导航)时,新绘图区域中的图标应该更新为相关图片。

注意- 此时树模型将被完全填充 - 只有图标不会被加载。

这不是我真正的专业领域 - 我正在寻找实现上述目标的最佳方法的指针。

具体来说——可以暴露哪些 Gtk+3 绘图区域信号(或多个信号)(Gtk.ScrolledWindow / Gtk.IconView ?)来编写 python 代码来计算应该更新哪些图标?

【问题讨论】:

【参考方案1】:

您应该分析您的应用程序以查看需要时间。

这是加载图像吗?如果是这样,那么加载默认图像并将其添加到视图中的任何位置都足够快,因为您只会加载一个图像。然后,您可以使用 idle_add 根据应出现在视口中的图像按需加载和更新图像。

如果需要时间将图像添加到模型中,那么您需要通过在 idle_add 回调中检查视口上可见的内容来按需添加。

如果两者都很慢,您需要混合使用两种解决方案:按需加载和添加。

还要考虑代理设计模式,该模式可用于创建将在后台加载的假封面对象,并包含加载策略。

对于信号,您的 GtkIconView 小部件实现 GtkScrollable,它解释了如何使用 implement scrolling。您将设置您的vertical adjustment 并通过连接到它的value-changed 信号来检查它何时发生了变化。这意味着用户向上或向下滚动,您需要使用timeout_add 启动计时器。如果在短暂的超时后(我认为在 0.5 到 1 秒之间,但需要测试),调整没有改变,这意味着用户停止滚动,您可以更新显示的内容。否则,它会在滚动时更新,从而减慢一切。然后你只需要弄清楚如何找到哪些项目出现在视口中,以更新它们的封面。

虽然我以前从未这样做过,但我对 GTK 有点了解,只是想弄清楚它是如何完成的,所以请谨慎阅读。无论如何,反应性的答案是“按需”。

【讨论】:

【参考方案2】:

但另一方面,如果您必须完全向下滚动,则必须等待构建每个页面。所以我想你最好考虑一下事件循环的idle_add函数。

这样您的屏幕就不会锁定,您的电脑也不必等待用户加载页面的视图页面。为您和您的应用程序双赢。 ;-)

【讨论】:

以上是关于在 Gtk ScrolledWindow 中滚动时我应该捕捉哪些信号?的主要内容,如果未能解决你的问题,请参考以下文章

“将大小分配给...”在 Gtk.ScrolledWindow 中使用 Gtk.TreeView 时出现 GTK 警告

如何在 gtkmm 上将 Gtk::Widget 转换为 GtK::ScrolledWindow?

gtk(或 gtkmm)3 加宽滚动条以供嵌入式(触摸屏)使用

有时 GTK 模态对话框不是模态的 --- 错误或功能?

使用 Gtk::Viewport (gtkmm3) 直接滚动

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