ウィジェットの大きさを画面に合わせる その2
「昨日のやつで色々試していたら、ScaleBoxだけじゃなくSizeBoxも重要なことがわかった」
「画面全体をScaleBoxに入れてしまえば、全体的に拡大出来るのでは? と思ってたんだけど、それをやると中にいれたCanvasPanelが思ったのと違う大きさになってしまってた。Canvas自体に大きさを指定する昨日が無いから、Canvasの中身次第で大きさが変わってしまって、拡大縮小する前にすでに思ったのと違う状態になってた。そこでScaleBox・SizeBox・CanvasPanelの三重構造にしてみたところ予定通りの動きになった。図ではScaleBoxとSizeBoxの間にもCanvasパネルが入ってるけど、これは試行錯誤の途中で入っただけで必要ない」
妹「SizeBoxは何するやつなの?」
「CanvasPanelに限らず、ほとんどのウィジェットはScaleBoxに入れられた時点で大きさが変わったり、もしくは中にいれられたものに応じて変わったりするんだけど、SizeBoxには自分の大きさを決められるという特性がある。ChildLayoutという、何かの中に入れられた時に使われる特殊パラメータがある。だからScaleBoxの中に入れてもサイズが変わらない。画面いっぱいのSizeBoxを作れば、それをScaleBoxの中に入れても画面いっぱいのままの状態を維持出来る」
妹「じゃあCanvasPanelの代わりにSizeBoxを使うの?」
「中身のウィジェットが1個ならそれでいい場合もあるけど、SizeBoxはScaleBoxと同じで子ウィジェットが1個限定という規則があるから、SizeBoxで大きさを指定して、その中にウィジェット配置用のCanvasを置くのが基本だと思う」
妹「Canvasにも大きさ指定パラメータってあるんじゃないの?」
「それは親ウィジェットによるんだよ。さっきも言ったけど、ScaleBoxみたいに中身の大きさを勝手に変えるタイプのウィジェットの子になってると、アンカーとか何とか、その辺のパラメータが操作不能になる。でもSizeBoxは標準のと別の方法でサイズ指定してるから使える。ただサイズ指定の単位がまだ良くわかってない。横1280ピクセルでデザインしてるはずなのに、画面いっぱいにすると1948とかいう謎の数字に……」
妹「単位わかんなかったらどうやって設定するんだよ!」
「目分量で済むとこはそれでいいんだけど、画面いっぱいとかだとそれはちょっと困る。そこで正確な数字を調べる方法を思いついた」
「画面いっぱいのCanvasPanelを作ってその大きさを測って、その数字をそのままSizeBoxに入れる。」
妹「CanvasPanelの中にCanvasPanel作る意味なくない?」
「これは意味あるやつ。親ウィジェットによってパラメータが操作不能になるって言ったけど、これはルートに置いてもそうなる。作ったウィジェットを他のウィジェットの子として呼び出すこともあるから、親ウィジェットがなんでも対応出来る扱いになってる」
妹「それで、SizeBoxの中にCanvasPanelを置くと」
「その時CanvasPanelの大きさが変だったら、レイアウトの横方向に揃えてフィルと縦方向に揃えてフィルを押しておく。先にCanvasPanelが作ってある場合は、階層メニューのとこで右クリックして、ラップするを選ぶ方が早い。今回の場合だったらCanvasPanelをSizeBoxでラップして、SizeBoxをScaleBoxでラップする。ラップ対象のウィジェットのアンカー設定も引き継いでくれる」
妹「うーん、今日はなんだかむずかしいな。でもウィンドウの大きさ変えないんだったら、大きさが変わるのは別に気にしなくていいという話だったのでは?」
「ScaleBoxに関してはそうなんだけど、SizeBoxの特性はウィンドウの大きさ変更以外にもかなり役立つ。どうしようかと悩んでいたのが色々解決した。その話を明日する予定」