2023-01-13

QAbstractButton の利用 〜 PySide6 〜

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 クラスを下記に示しました。

qt_custom_switch.oy

Switch は小さなウィジェットです。実行例を示しました。

Switch is True

このサンプルで判ったことは、QAbstractButton を利用するには、ウィジェットを描画して表示する paintEvent メソッドと、表示サイズの推奨値を保持している sizeHint メソッドを、最低限オーバーライドして機能を実装する必要があるということでした。😁

さて、くだんのチェックボックスだけのウィジェットですが、QAbstractButtton を継承して、チェックボックスのチェック/アンチェックのイメージを切り替えて表示するようにしたものを作成したところ、これでメモリ使用量をざっくり3割程度に削減できました。これは 100 × 1000 以上の大きなチェックボックスのマトリックスを、スクロールバー付きで表示するような特殊な用途です。

参考サイト

  1. QAbstractButton - Qt for Python
  2. python source code of qutilities
  3. QPainter - Qt for Python

 

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



このエントリーをはてなブックマークに追加

0 件のコメント: