簡體   English   中英

如何在 GTK4 (>= 4.10) 中構建樹

[英]How to build a tree in GTK4 (>= 4.10)

如文檔所述,自 4.10 以來,GTK4 中的 TreeView已被棄用。 推薦的替代品是 ColumnView。 但是,我找不到關於如何通過 ColumnView 在 GTK4 中構建類似 treeView 的小部件的明確文檔或示例。 我發現可能與它相關的TreeExpander但我仍然不知道如何處理它。

我所做的一個非常簡短的概述:

  1. 熟悉新的動態列表小部件(Gtk.GridView 和 Gtk.ColumnView)如何為平面 model (GLib.ListStore) 工作。 演示應用程序中有示例代碼。
  2. 創建一個 Gtk.TreeListModelCreateModelFunc function,它將 model 項作為參數,如果該項有子項(例如,是文件系統模型中的文件夾),則創建並返回一個 Gtk.ListStore 來保存子項。 如果子項已經可用,那么也可以在此處將它們附加到子項 model。 這意味着無論行是否展開,都會預加載子項。 出於啟動性能的原因,您可能希望安排在行實際展開時加載它們,這更加困難 - 在這種情況下,您必須向 model 添加一個虛擬子項,否則將不會顯示展開器。
  3. 創建一個 Gtk.SignalListItemFactory。
  4. setup處理程序中,像往常一樣創建一個顯示小部件,而不是使用您的顯示小部件作為 Gtk.ListItem 的子項,而是創建一個 Gtk.TreeExpander,並使該子項成為 Gtk.ListItem 並使顯示小部件成為擴張器。
  5. bind處理程序中,從提供的 object 中獲取顯示小部件和 model 項。這里的一個復雜問題是 object 可能是一個 Gtk.TreeListRow,其項可能是另一個 Gtk.TreeListRow,因此更難到達 895361。 像往常一樣將小部件綁定到 model 項目。 然后從 Gtk.ListItem position 中獲取 Gtk.TreeListRow 並將擴展器的list-row屬性設置為它。
  6. 如果您延遲加載子項目,那么您需要檢測該行何時首次展開。 您可以連接到Gtk.TreeListRow.expanded屬性的notify信號來執行此操作。
  7. 使用帶有 GLib.ListStore 的 Gtk.TreeListModel 作為其root_store作為 Gtk.ColumnView 的 model(像往常一樣包裝在 Gtk.SelectionModel 之后)。 必須passthrough屬性設置為false ,否則不會出現擴展器。 如果您按需加載子項目,那么autoexpand也應該是false
  8. 如果您使用的是 Gtk.ColumnView 多列,則只需將擴展器添加到第一列。 否則工廠信號處理程序或類似於平面 model 除了bind處理程序需要適應 Gtk.TreeListRow 參數。

簡化和性能改進很可能是可能的,或者 Gtk4 的更高版本可能會引入一些便利以使其不那么繁瑣。

我正在使用上述策略開發文件瀏覽器實現,目前位於https://github.com/elementary/files/tree/gtk4-treelistmodel但這可能會合並到其他分支(或放棄)。 請注意,此分支正在開發中並且包含未解決的錯誤,但項目的顯示有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM