人生初心者の雑記

すべてにおいてド素人な人がいろんなことを書くよ

コードを書かずにQtデザイナでScrollAreaにVLayoutを適用させる

Qtデザイナでスクロールエリアにレイアウトを適用したい
f:id:stalagmite:20160604233325p:plain




スクロールエリアが空だとレイアウトのバーが暗く、適用できない。
f:id:stalagmite:20160604233328p:plain





なんか一個入れてあげると、設定できるようになる。(じゃあ最初から設定させてくれよ。やり方あるのかな?)
f:id:stalagmite:20160604233330p:plain







ScrollAreaのなかにQtデザイナの画面左側のオブジェクト群からGridLayoutを入れてしまうのは、余分なWidgetの入れ子ができてたぶんよろしくないし意図したとおりに動かねえ。
f:id:stalagmite:20160604234612p:plain






VLayoutを設定するとscrollAreaWidgetContentsの表示がそのレイアウトになる
f:id:stalagmite:20160604235031p:plain







このままだとプログラムから動的に要素を追加したときに変になるのでいろいろする


scrollAreaWidgetContentsを選択->LayoutのlayoutSpacingを変えてオブジェクト間のスペース調整する


動的に追加するオブジェクトは、追加するときにMinimumSizeを適切に設定する。そうしないとオブジェクトをたくさん追加していってスクロール範囲を超えそうになっても、ScrollAreaの中身のオブジェクトがつぶれるだけでScrollAreaは広くならない。よってWidgetを動的追加するときは、そのWidgetのMinimumサイズを設定し、Widgetがつぶれないようにする。
f:id:stalagmite:20160605000226p:plain
textsareaはScrollAreaの名前をQtDesigner上で変更したもの
ScrollAreaそのものはWidgetじゃなく、ScrollArea直下のWidget(二つ上の画像ではScrollAreaWidgetContents)がスクロールエリア内のWidgetをもつ。よって、
textsarea->widget()->layout()->addWidget()
のように書く。赤字を忘れないように

結果
f:id:stalagmite:20160605001210p:plain



child.uiの中身。



補足
ScrollArea内の要素を上詰めしたいときはVerticalSpacerを入れる。ScrollArea内の要素の追加や削除は、スペーサの手前に挿入、あるいはスペーサの手前のWidgetを削除というようにしなければならない。

f:id:stalagmite:20160605233549p:plain


削除の一例。ScrollAreaの末尾にスペーサを入れたので、ScrollAreaに最後に入れた要素を削除したいときはitemAtでスペーサの一個手前のオブジェクトを指定する。

void child::on_removebutton_clicked()
{
QVBoxLayout* layout = dynamic_cast<QVBoxLayout*>(this->ui->ScrollAreaContentWidget->widget()->layout());
if(layout->count()>=2){
//verticalspacerの手前に要素を入れなければならない。vlayoutの添え字は0から始まる。
QWidget* w = layout->itemAt(layout->count()-2)->widget();
delete w;
}
}