Qt 5.12 で QtQuick モジュールに TableView タイプが追加されます。
これまでにも Qt Quick Controls モジュールには TableView タイプが存在していました。しかし、パフォーマンス改善などを行った Qt Quick Controls 2 モジュールには TableView 相当の QML タイプがなく、Qt 5.11 で Qt Quick Controls モジュールが非推奨になったにもかかわらず代替機能が無い状態でした。
Qt 5.12 に追加される TableView は QML で書かれていた Qt Quick Controls の TableView とは異なり、全面的に C++ で作成されています。これまでの ListView でのフィードバックも反映されているようで、色々とパフォーマンスなどに注意して作成されているようです。その代わり機能的にはまずは最小限での実装となりそうです。
ListView / ListModel で無理矢理テーブル表示を行っていた Qt Quick Controls 版に比較すると、QtQuick 版は以下の様な特徴を持ちます。
- C++で作られており高速である
- QAbstractItemModel で作成されたテーブルモデルが利用可能
- デリゲートの再利用機能
特に特徴的なのがデリゲートの再利用機能でしょう。ListView ではデリゲートが生成したアイテムが画面外に移動した際に、画面外に出たデリゲートの生成したアイテムを破棄して、新しく画面に入ってきたアイテムを生成します。これ自体は特に問題の無い挙動なのですが、パフォーマンス悪化の原因となったり、メモリの確保や解放のタイミングとの兼ね合いでメモリのフラグメンテーションに繋がり、使用メモリ量の増大を引き起こします。
新しい TableView では画面外に出たアイテムを開放するのではなく、再利用することでメモリの確保・解放の回数を減らしています。しかし、再利用機能を使用するにはデリゲート側で再利用に対応したコードが必要となります。モデルのデータをバインディングして利用している場所は問題ありませんが、Component.onCompleted を使用していたり、プロパティの値を書き換えていたりした場合、以前の値が残るために再利用のタイミングで初期化が必要となります。そのために TableView.onPooled や TableView.onReused が用意されています。
このため、再利用機能の ListView への取り込みは現状では予定されていないようです。取り込まれるとしても TableView とは異なり、デフォルトでは無効にされると思われます。ListView でのパフォーマンス・メモリトラブルは少なくないので、是非取り込んで欲しい機能の一つです。
モデルに関しては現状では C++ で QAbstractItemModel 系のクラスを使用する必要がありますが、TableModel タイプが後日導入されるそうです。
機能的には現状は色々と足りていない状態で以下の機能がそれぞれ未実装となっています。
- ヘッダー
- セレクション系
- span系
まだ詳細は不明ですが、モデルのロールでデリゲートを選択するための DelegateChooser も開発中のようです。このような機能もこれまでの Qt Quick ではパフォーマンスの確保が難しかったため、ListView へ適用出来るかなどが気になるところです。
ListView、TableView とくると残りは TreeView ですが、こちらは TableView が一段落がついた後になりそうで、まだまだ時間がかかりそうです。興味がある方は QTBUG-61630 に Vote しておくといいでしょう。