コードを書かずにQtデザイナでScrollAreaにVLayoutを適用させる
Qtデザイナでスクロールエリアにレイアウトを適用したい
スクロールエリアが空だとレイアウトのバーが暗く、適用できない。
なんか一個入れてあげると、設定できるようになる。(じゃあ最初から設定させてくれよ。やり方あるのかな?)
ScrollAreaのなかにQtデザイナの画面左側のオブジェクト群からGridLayoutを入れてしまうのは、余分なWidgetの入れ子ができてたぶんよろしくないし意図したとおりに動かねえ。
VLayoutを設定するとscrollAreaWidgetContentsの表示がそのレイアウトになる
このままだとプログラムから動的に要素を追加したときに変になるのでいろいろする
scrollAreaWidgetContentsを選択->LayoutのlayoutSpacingを変えてオブジェクト間のスペース調整する
動的に追加するオブジェクトは、追加するときにMinimumSizeを適切に設定する。そうしないとオブジェクトをたくさん追加していってスクロール範囲を超えそうになっても、ScrollAreaの中身のオブジェクトがつぶれるだけでScrollAreaは広くならない。よってWidgetを動的追加するときは、そのWidgetのMinimumサイズを設定し、Widgetがつぶれないようにする。
textsareaはScrollAreaの名前をQtDesigner上で変更したもの
ScrollAreaそのものはWidgetじゃなく、ScrollArea直下のWidget(二つ上の画像ではScrollAreaWidgetContents)がスクロールエリア内のWidgetをもつ。よって、
textsarea->widget()->layout()->addWidget()
のように書く。赤字を忘れないように
結果
child.uiの中身。
補足
ScrollArea内の要素を上詰めしたいときはVerticalSpacerを入れる。ScrollArea内の要素の追加や削除は、スペーサの手前に挿入、あるいはスペーサの手前のWidgetを削除というようにしなければならない。
削除の一例。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;
}
}