我正在制作一些 GTK 桌面小部件,用于监视系统托盘元素或任务栏打开的窗口等内容。
对于任务栏,我采取的方法是每次从窗口管理器收到“更改”信号时重新填充 Gtk.Box:我从 GtkBox 中删除所有内容,然后根据查询重新添加所有内容我在状态更改后对窗口管理器执行操作。这样我就不用担心点单或者错过信号了。
但是,我想知道是否有办法将
Gtk.Box
绑定到数组,以便它自行处理更改。 FlowBox
有一个bind_model
方法似乎适合我的用例,但是FlowBox
似乎也比简单的Box
更复杂:Box
(或Container
,或Widget
)不提供类似的机制?
GtkBox
不支持这样的功能,因为它旨在成为一个简单的容器小部件。
像
GtkListBox
和 GtkFlowBox
这样的小部件通过支持绑定到 GListModel
来实现。但小部件和列表模型都没有运行任何复杂的逻辑;列表模型跟踪成员的位置和数量,发出 items-changed
信号。 GtkListBox
和 GtkFlowBox
跟踪成员小部件,并对信号做出响应。
如果您担心性能,您应该只为您的用例实现
GListModel
并将其绑定到 GtkListBox
或 GtkFlowBox
。然后,您可以使用 items-changed
、position
和 removed
参数发出 added
,以仅反映真实的更改。