Skip to main content

Widget とカスタムウィジェットを作成する

前回サクッと QtDesigner を仕様して UI を作って見ましたが
度々でてくる「Widget」というものがなにを指しているのか
まずは改めて説明をしたいと思います。

Widget

Widget とは、PySide の UI を構成するパーツの 1 単位です。

QtDesigner の画面を見てみると、ウィンドウに配置するためのパーツは
「ウィジェットボックス」に並べられています。
この1つづつがいわゆる「Widget」で、ここにあるものは PySide がデフォルトで
用意してくれている GUI のパーツになります。

PySide にある各種パーツはすべて「Widget」扱いになっていて
Window も配置するための Layout も Button 等のパーツもすべて Widget です。

それのなにが重要かというと
すべての Widget は「QWidget」クラスを継承していて、この QWidget 内の関数を
共通して使用することができるのです。

この QWidget は、すべての GUI のイベント(マウス、キーボード、その他諸々)を受け取って
処理をする機能と、描画をする機能を持っています。
なので、このクラスを継承している各 Widget は
それぞれ固有の機能と描画を持たせて、配置することで GUI を構成するようになります。

親子化

Widget は親子化されて構成されています。

どのように構成されているかは、オブジェクトインスペクタをみるとわかりやすいです。
この例の場合 Window > Layout > LineEdit のように構成されているのがわかります。

親子化すると、Show/Hide 時はまとめて適応されたり、
関数を使用して子の Widget をリストしたり、
まとめて操作したりすることができます。

Window

上記の通り、Widget は親子化されていますが
一番親のルートに当たる Widget は「Window」と呼ばれます。

カスタムウィジェット

PySide では、自分でカスタマイズした Widget を作成することができます。
作成するのには、まずは QtDesigner の Widget から UI を作成します。

作成するのは、ファイルパスをセットするための Widget。
このカスタム Widget は Label と LineEdit と ToolButton を並べただけです。

https://snippets.cacher.io/snippet/c916ee4236b639c38cee
UI ファイルはこれ。
コードは以下の通り。

カスタムウィジェットを作成すると、よく使う GUI パーツを使い回しできるようになります。

実行すると、このようになります。

カスタムウィジェット単体では、このようになっています。

カスタムウィジェットを作成する場合は、QWidget クラスを継承したクラスを作成します。
作成したら、そのクラス内で ui ファイルをロードし、Layout に配置します。
あとは、ボタンを押したときの Signal-Slot を作成します。

最後に、作成したカスタムウィジェットを Window で作成して配置します。

今回のようなファイルをセットする UI などは
どの UI でも使用するので、カスタムウィジェットとして共有化しておくと
とても便利です。