PySide (Qt for Python) は、Qt(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。配布ライセンスは LGPL で公開されています。最新のバージョンは Qt6 に対応した PySide6(記事執筆時点で 6.4.2)です。
PySide6 で利用できる GUI のウィジェット(部品)は機能が豊富に備わっているので使っていて楽しいのですが、極めて大量かつ同じウィジェット(例えばチェックボックスだけのウィジェット)を表示したいときに、機能が豊富が故にインスタンスあたりのサイズが大きいのか、メモリがたくさん消費されて困ります。
そんな時、特定の目的に機能を絞った軽いウィジェットを作ることができれば、と考えました。チェックボックスのように抽象クラスの QAbstractButton [1] を継承、実装しているボタン系ウィジェットであれば、必要な機能だけを実装したウィジェットを作れば、メモリの消費を抑えられるかもしれません。
そう考えて、まず QAbstractButton から作ったウィジェットのサンプルが公開されていないか探しました。なかなか都合の良い例がありませんでしたが、Toggle ウィジェット(クラス)[2] というのを見つけましたので、PySide6 用に少し直して紹介します。なお、ここでは Swicth と、ウィジェット(クラス)の名前を変えました。
下記の OS 環境で動作確認をしました。
Fedora Linux 37 | (Server Edition) | x86_64 | |
python3.11 | python3-3.11.1-1.fc37.x86_64 | ||
PySide6 | 6.4.2 |
抽象クラス QAbstractButton を直接継承して機能を実装した Switch クラスを下記に示しました。
Switch は小さなウィジェットです。実行例を示しました。
Switch is True
このサンプルで判ったことは、QAbstractButton を利用するには、ウィジェットを描画して表示する paintEvent メソッドと、表示サイズの推奨値を保持している sizeHint メソッドを、最低限オーバーライドして機能を実装する必要があるということでした。😁
さて、くだんのチェックボックスだけのウィジェットですが、QAbstractButtton を継承して、チェックボックスのチェック/アンチェックのイメージを切り替えて表示するようにしたものを作成したところ、これでメモリ使用量をざっくり3割程度に削減できました。これは 100 × 1000 以上の大きなチェックボックスのマトリックスを、スクロールバー付きで表示するような特殊な用途です。
参考サイト
にほんブログ村
#オープンソース
0 件のコメント:
コメントを投稿