[PySide] TableViewでリソースブラウザの一覧っぽいものをつくるテスト

PySideの Delegateまわりと、Pointerを使用したModelの書き方のおさらいがてら
Mayaで使用するリソースブラウザのリソース一覧を作るテストをしてみました。

resouce_browser_test

とりあえず現状はこんな感じ。
右側が今回作った部分、いずれは画像も出せるようにするつもりですが、とりあえず文字だけ出す感じで。

UI部分のPtyhonは → これ

長いけど、以下コード

まずModel。
今回はTableViewを使用してますが、リソースブラウザとかはListで持っておきたいので
データそのものはリスト型で持たせています。
モデルのデータを取得するindex部分で、columnとrowからindexを取得するようにしています。
column_numを変更すれば、タイル状に並べられるようにしています。

indexでセットするアイテムを制御する時は、data関数ではinternalPointer()を使用することで
現在処理をする column row のModelIndexを取得できます。
きちんと計測したわけではないのですが、コレを使用せずに data内で self.__items[row] でデータを
取得しようとするとものすごく遅くなる印象があります。

Itemをセットするときは、 layoutAbout~とlayoutChanged を両方emitします。
layoutAbout~のほうがないと、動くけれども動作がものすごく不安定になります(何故?

Modelにセットする値は、専用のクラスを作成します。
Delegateでこのクラスの値を読み込むので、dataでは DisplayRole でこのクラスオブジェクトを返します。

続いてDelegate。
Delegateは、TableのセルだったりListの1要素だったりの描画やらその他諸々の処理を実装するもの。
それと知らず、Tableの行すべての背景色を変えるとかをDelegate側で行おうとして描画がぶっ壊れてどうにもならん
問題で苦しみました。
DelegateとViewとでどちらでやったらいいんだろう?何が違うんだろう?と思っていたのですが
View全体にわたる描画まわりを書きたい場合はViewのpaint
Cell1つずつの描画を書きたい場合はDelegateのpaint
でやればいいと認識しました。

今回は、1つのセルが1つのアイテム、アイテム単位で見た目を描画したいので
Delegateのpaintで作成します。
option.rect で、1つのCellの矩形を取得できるので、それをベースに色々イイカンジにレイアウトしていきます。
今回は、とりあえずかどが丸い四角と文字を描画してみています。

セルの大きさは、 sizeHint で設定。
この大きさで固定するために

Headerサイズではなく、sizeHintの数値を使用するようにします。

D&Dで入れ替えしたいなら、GraphicsViewを使用する方がいい気がしますが
今回みたいにListをタイル状に並べるのなら今回のやり方のほうが良さそうですね。

最近あんまり暇な時間がないので日曜プログラミングが捗らないですが、ちまちま作っていこうズサーc⌒っ゚Д゚)っ

コメントを残す

メールアドレスが公開されることはありません。


*