[PySide] Delegateの使い方を調べる(改

以前やったDelegateの使い方を再度やり直して理解しなおしたので、忘れないうちにメモ。

前回の記事がこちら。

[PySide] Model・View・Delegateの使い方を調べる

前回はなんとなーく理解をしていた程度でしたが、GraphicsItemで遊ぼうのおかげで
描画周りの理解が進んだおかげか前よりだいぶ分かるようになりました。

まず、今回やりたかったのが TableViewの中にCheckBoxを入れたい というもの。
Viewでやる場合のやり方サンプルがイマイチ見つからずヽ(`Д´)ノウワァァァンになりました。

delegate_test

できあがったUIはこちら。
以下ソース。

Delegateを使用した場合は、 描画 と 編集 それぞれを定義することで
値の入出力をコントロールするイメージかなと思っています。
その段階は、
edit実行→編集→編集完了→適応
この大きく分けて4段階存在しています。
それぞれが、
editorEvent createEditor setEditorData setModelData
この4つの関数に対応しています。

Edit実行したときの内容は、 editorEvent をオーバーライドすることで実装します。
今回の場合なら、「CheckBoxをクリックするとステータスが変わる」部分をこのeditorEventに入れています。
CheckBoxの領域内でのみ、ステータス変更が実行されるようにするには、
QRect.contains() と MouseのPosition を使用して、範囲判定を行います。

チェックボックス部分は、Editモードに入って欲しくないので
Editorモードではなにもしないようにしています。
対して、プログレスバーのほうはEditモードにはいって欲しいので
createEditor setEditorData setModelData の3つを定義して、編集・完了・適応 処理を行っています。

delegate_test2

painter部分。

option.rect で受け取っているのは、Viewの中の処理をしたいCellの矩形になります(上の画像で言うと、赤い部分)
なので、Cellの中に描画する場合は、この矩形を利用して描画します。
今回のCheckBoxは、Cellの真ん中に配置したかったので、配置する部分の矩形を計算してセットしています。

あとは、 画像の描画領域をQRectで設定し、貼り付けたい画像をdrawPixmapで描画。

プログレスバー部分は、PySideが用意している描画テンプレート的なものを使用しています。
プログレスバーを表示したい領域や、数値をセットして、その結果を
QtGui.QApplication.style().drawControl(QtGui.QStyle.CE_ProgressBar, bar, painter)
ここで描画しているってことですね。
時前で作成したい場合は、DrawRect等を利用すればOKということですね。なるほど。

painterでの描画をもっと極めれば(というかUI作成のセンスがあれば)いかにもテンプレで作りました 的な無骨なUIを卒業して
オサレでカッコイイUIが作れそうです。
描画周りは奥が深いな~ということで、継続的に色々と覚えていこうと思います。

コメントを残す

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


*