yslog

ゆるめに技術ブログかきます。Maya_Python

ウィンドウサイズに応じてウィジェットを自動再配置するUIをつくろう

こちらはMaya Advent Calendar 2018 12月19日の記事です。

 

今年はアドカレはパスかな、、って思ってたけど誕生日空いてたので滑り込み!

PySideのUIネタなんぞを一つ。

UIの動的再配置!

・Maya標準機能のUI

ウィンドウサイズを縮めるとが見切れて使いづらい!

・カスタムツール

そもそも中身のウィジェットサイズ以下に縮まらなくて画面専有しすぎ!

 

ってことありませんか?ありますよね?ありますとも。

 

 ↓小さいウィンドウサイズで使おうとすると大事な部分が隠れちゃうとか、、

f:id:ys_45:20181218220852g:plain

 

SoftimageのUIは親切設計でUIサイズが変更されると動的にUIパーツが並び替わるって仕様でした。

 

↓SIの動的再配置、あの頃はよかった。。。

f:id:ys_45:20181218221615g:plain

 

自作のツールにはどうしてもこれが欲しい!ってことでPySideで実装したときの記録。

実装に必要なもの

ウィジェットサイズよりも縮む受け皿

QScrollAreaで桶。

・自由に配置できるレイアウト

今回はQGridLayoutをつかいました。

配置位置をx, y , w, hで自由に指定。

・ウィンドウサイズ変更をトリガに再配置を実行する

こちらはウィンドウにresizeEventを仕込むことで実装。

・動的再配置処理

配置するウィジェットのサイズを予め取得しておいて、ウィンドウサイズに収まり切らなくなったら行を変えて配置する仕組みを考えます。

再帰的に配置していって要素がなくなれば終了みたいな。

 

というわけで最低限の要素でひとまず作ってみましょう。

 

 ↓はい実装。※時間がなくて説明少なめです、すんまそ。

UniqueWigetLayout1

 実行するとこんな感じでボタン配置が動的に変化するウィンドウが開きます。

ちゃんと動きましたね。よかった。

f:id:ys_45:20181218230119g:plain

 

要素のグループ化

 これでも要件は満たすんですが、スピンボックスとスライダーを一組にしたい、とかボタンをグループごとに分けたいって場合もあると思います。

そういう場合はボタンリストに登録するウィジェットをひとまとめにするウィジェットでラッピングしてやるとよさそうです。

 

↓はい実装。※時間がな(ry

UniqueWigetLayout2

 

実行するとこんな感じでグループごとにまとまって配置されます。

今度もちゃんと動きましたね。よかったよかった。

f:id:ys_45:20181218231753g:plain

 

そんなこんなで公開しているツールSIWeightEditorも同じ仕組みでUIを作ってます。

こちらはテーブルと上部ペインの比率も動的に変化します。

f:id:ys_45:20181218232538g:plain

 

他QSplitter、QStackedWidgetと組み合わせると標準ウィジェットでは難しい多段タブ動的配置ツールランチャーも作れたりします。

こちらもSIにありましたね。

 

↓SIのシェルフ、あの頃はよか(ryf:id:ys_45:20181218232904g:plain

今回のものに限らずUI設計はちょっとした心遣いでとっても使いやすくなり、反面設計が悪いととってもわかりにくいものになりやすいですね。

個人的にデザイナーに使ってもらえるかどうかはUIの導入のよさ、(あとスタイリッシュさも笑)がかなり大きいと思ってます。

わかりやすく、使いやすい、機能面でも優れているツールづくりを目指したいですね。

 

明日はお待ちかねPySideマスターUnPySide(リンゴ酸)さんの記事でっす。

素敵なサムシングよろしくお願いしまーす。

 

おしまい。

 

2019/02/24追記

ウィンドウサイズ変更時にレイアウトに変化がない場合は再配置しない形にしたもの追加。ボタン数が数百とかになってきた場合の負荷対策。

UniqueWigetLayout3