QtQuick.TableView

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 しておくといいでしょう。

Qt Developer Day Tokyo: Qt Quick の紹介

5/20 の Qt Developer Day Tokyo まで約一週間となりました。Digia の主催としては初の開催ですが、無料かつ翻訳付きなので今後のためにも是非皆さんに来て頂きたいと思います。

ご存じの方もいらっしゃると思いますが、SRA がプラチナスポンサーということもあり、「Qt Quick の紹介」セッションを受け持つこととなりました。

以下はセッションの紹介です(私が書いた文章ではありませんが)。

「Qt Quick は宣言型の UI のデザインと、命令型のプログラミングロジックを分離した最新のユーザーインターフェース開発技術です。従来から Qt で使用されている C++ の API の代わりに、QML と呼ばれる宣言型のプログラミング言語を使用してアプリケーションのプレゼンテーション層を記述します。Qt Quick を使用することにより、なめらかに動作する UI の開発が非常に簡単になります。製品の競争力の鍵であるユーザーインターフェースを構築するために必要な要素がすべて揃っています。このセッションでは Qt Quick の基本的なコンセプトを説明した後、なめらかに動作するユーザーインターフェースを構築するための様々な機能やベストプラクティスを紹介する予定です。」

セッションの詳細はまだ検討中ですが、基本的には初心者向けに概要を紹介するセッションになると思います。どの程度コードを扱うかはまだ未定ですが、深いところまでは掘り下げないつもりです。もしこのセッションで聞きたいことなどありましたらご連絡ください。

余談ですが、SRA としては組込みシステム開発技術展(ESEC)にも Qt で出展します。Qt Developer Day で展示するものとほぼ同じものになりますが、組み込み向けの Qt のデモ展示(i.mx6, vxWorksなどを予定)を行いますので、Qt Developer Day には参加できない方はこちらへどうぞ。時間帯によっては私も説明員として立っています。

“Qt Developer Day Tokyo: Qt Quick の紹介” の続きを読む

QML エンジンの内部構造(バインディングの詳細)

先月作成した「Qt Quick 2 のスピード」という記事ですが、こちらの予想以上に読んでいただいているようです。その記事では紹介していませんでしたが、QML エンジンの内部構造については KDAB が “QML Engine Internals” というシリーズの記事を作成しています。興味の有る人は是非そちらも読んでみてください。

今回はその中の “QML Engine Internals, Part 3: Binding Types” を基に 「Qt Quick 2 のスピード」の補足をしてみようと思います。

“QML エンジンの内部構造(バインディングの詳細)” の続きを読む

Qt Quick 2 のスピード

Qt5 の目玉である Qt Quick 2 は OpenGL や QML Scene Graph、V8 JavaScript エンジンの採用でパフォーマンスを Qt Quick 1 から大幅に向上させています。とは言うものの、バグや Mesa のようなソフトウェア 3D エンジンの利用などで Qt Quick 1 よりも遅くなることもあります。

は Qt Quick 2 でアプリが遅くなったことに関する質問から始まったやりとりですが、その中で Qt5 では上記以外にどのようなテクニックを使って Qt Quick のパフォーマンスの改善を行っているかの説明があります。興味深い内容ですので、要約してみましょう。

“Qt Quick 2 のスピード” の続きを読む