QAbstractItemModelのdataの使い方
TreeView を使用するとき、各セルの見た目を細かく調整したい場合は
デリゲートを作り、paint で細かく自前で書くことで調整ができたりしますが
正直そこまでするのはめんどくさい...ということもけっこうあります。
そういうときは、Model 内の data の Role を使用することで、
ある程度表示を調整できたりするので
今回は使えそうなものをいくつかテストしてみました。
完成図はこちら。
https://snippets.cacher.io/snippet/27cf2d61d60cc5220fce
コードはそこそこ長いので、全コードは ↑ にアップしました。
QAbstractItemModel から Model クラスを作る¶
まず Model を作ります。
PySide の ListView は複数カラムを持つことができませんので、上のような
複数カラムを持つ TreeView を使用します。
この TreeView で使用するための Model は QAbstractItemModel を使用する必要があります。
このクラスは
- index
- parent
- data
- rowCount
- columnCount
を実装する必要があるのですが、親子化なしの場合はどう作るかがわかりにくいですが
1 2 3 4 5 6 7 8 |
|
特に親子化が不必要な場合は、上のように index と parent を作れば OK です。
(parent が QModelIndex()の場合は、いわゆるルート Item 扱いになるから)
data・Role について¶
この Model クラスは、 data 関数を経由して、View で表示するのに
必要な各種データをやり取りしています。
表示に必要なのは「文字列」とかが考えられますが
PySide の場合はそれ以外にも「背景色」「文字色」「整列(センタリング)」なども
この data を経由してやり取りされます。
では、どのデータがやり取りされているのかというのを判断しているのは
なにかというと、それが「Role」と呼ばれるもので
data 関数の 2 つ目の引数としてうけとります。
1 2 3 4 5 |
|
data は様々な用途で呼ばれますが、「何に呼ばれたか」を判定するのが role で
その Role は こちらにリストがあります。
主なものとしては、表示される文字列の DisplayRole、背景色の BackgroundRole などがあります。
つまりは、この data 関数内で role で判定することで、
セルの見た目をいい感じに変更することができるというわけです。
その中から使えそうなものをテストしてみました。
DisplayRole¶
1 2 |
|
おそらく必須なのが DisplayRole
これの return した結果がセルの文字列として表示されます。
列方向は、 index.column() で、何列目を処理しているかを受け取ることができるので
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
このように、表示したいアイテムのクラスを用意して、
取得したい値を返すようにしています。
BackgroundRole¶
1 2 3 |
|
BackgroundRole は、QColor を返すことで、背景色を変更することができます。
1 2 3 4 5 6 7 8 9 10 |
|
使い方としては、ステータスごとに色を変えたい...みたいなときに
Item クラス側などに色を取得する関数を入れておくなどができます。
TextColorRole¶
1 2 3 4 |
|
TextColorRole は、表示される文字の色を変更するときに使用します。
TextAlignmentRole¶
1 2 3 |
|
AlignmentRole は、文字の整列をどうするか(右寄せ・左寄せ・センタリングなど)を
変更することができます。
ステータス表示とかは、センタリングしたほうが見た目が良いので
そういうときは指定の列のみセンタリングする...みたいな使い方ができます。
DecorationRole¶
1 2 3 4 |
|
DecorationRole は、文字の左側にアイコンを指定することができる Role です。
表示したい Icon の QPixmap または QIcon または QColor を指定することができます。
ToolTipRole¶
1 2 |
|
ToolTipRole は、セルにマウスオーバーしたときに表示される ToolTip を
変更することができる Role です。
これを使用すると、各セルごとに Tooltop の文言を
自由に変更することができます。
SizeHintRole¶
1 2 3 |
|
SizeHintRole は、各セルごとの大きさを指定することができます。
1 2 3 4 5 6 |
|
この SizeHint でサイズを変えるのは、ResizeToContents を指定したときに
使用される値になります。
UserRole¶
1 2 |
|
最後は UserRole
UserRole は実際にデータを使うときに
1 2 3 4 |
|
ModelIndex から値を取得したいときなどに
表示する以外に値を渡せるようにしたい場合等に使用します。
上の例だと、Item オブジェクトを取得できるようになります。
まとめ¶
Icon 表示はデリゲートを書かないとできないものだとおもってましたが
モデルだけでもできるのは初めて知りました。
大体の場合はこの実装でなんとかなりそうです。