Layout이란?
QWidget 클래스의 setGeometry( ) 멤버 함수를 이용해 GUI 상에서 특정 X, Y 좌표로위젯을 배치하게 되면 윈도우의 크기가 변경될 때 위젯의 위치가 변경되지 않는다.
하지만 레이아웃을 이용하면 윈도의 크기가 될 때마다 동적으로 GUI 상에 위젯들의 크기도 동적으로 변경된다.

- 윈도우의 크기가 변경되면 레이아웃은 위젯들을 최적의 위치에 정렬되어 일관된 크기의 모양을 유지할 수 있도록 해준다.
- 다음 표는 Qt에서 주로 사용되는 레이아웃 클래스들 이다.
| 클래스 | 설명 |
| QHBocLayout | 위젯들을 가로 방향으로 배치 |
| QVBocLayout | 위젯들을 세로 방향으로 배치 |
| QGridBocLayout | 위젯을 그리드(Grid) 또는 바둑판 스타일로 배치 |
| QHBocLayout | 위젯을 2열로 배치하는 형식 |
<widtet.cpp>
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
QHBoxLayout *hboxLayout = new QHBoxLayout();
QPushButton *btn[6];
QString btnStr[6] = {"One", "Two", "Three", "Four", "Six", "Seven"};
for(int i = 0 ; i < 6 ; i++)
{
btn[i] = new QPushButton(btnStr[i]);
hboxLayout->addWidget(btn[i]);
}
QVBoxLayout *vboxLayout = new QVBoxLayout();
QPushButton *vbtn[6];
QString vbtnStr[3] = {"Movie", "Drama", "Animation"};
for(int i = 0 ; i < 3 ; i++)
{
vbtn[i] = new QPushButton(vbtnStr[i]);
vboxLayout->addWidget(vbtn[i]);
}
QGridLayout *gridLayout = new QGridLayout();
QPushButton *gbtn[5];
for(int i = 0 ; i < 5 ; i++)
{
gbtn[i] = new QPushButton(btnStr[i]);
}
gridLayout->addWidget(gbtn[0], 0, 0);
gridLayout->addWidget(gbtn[1], 0, 1);
gridLayout->addWidget(gbtn[2], 1, 0, 1, 2);
gridLayout->addWidget(gbtn[3], 2, 0);
gridLayout->addWidget(gbtn[4], 2, 1);
QVBoxLayout *defaultLayout = new QVBoxLayout();
// defaultLayout->addLayout(hboxLayout);
// defaultLayout->addLayout(vboxLayout);
defaultLayout->addLayout(gridLayout);
setLayout(defaultLayout);
}
Widget::~Widget()
{
}
QHBoxLayout
- QHBoxLayout은 위젯들을 가로 방향으로 배치할 수 있다.
- 다음 예제에서와 같이QPushButton 위젯을 addWidget( ) 멤버 함수를 이용해 추가할 수 있다.
QHBoxLayout *hboxLayout = new QHBoxLayout();
QPushButton *btn[6];
QString btnStr[6] = {"One", "Two", "Three", "Four", "Six", "Seven"};
for(int i = 0 ; i < 6 ; i++)
{
btn[i] = new QPushButton(btnStr[i]);
hboxLayout->addWidget(btn[i]);
}

QVBoxLayout
- QVBoxLayout은 위젯을 세로 방향으로 배치할 수 있다.
QVBoxLayout *vboxLayout = new QVBoxLayout();
QPushButton *vbtn[6];
QString vbtnStr[3] = {"Movie", "Drama", "Animation"};
for(int i = 0 ; i < 3 ; i++)
{
vbtn[i] = new QPushButton(vbtnStr[i]);
vboxLayout->addWidget(vbtn[i]);
}

QGridLayout
- QGridLayout은 바둑판 모양과 같은 스타일로 위젯을 배치할 수 있다.
- QGridLayout은 특정 행을 하나의 위젯만 배치할 수 있도록 병합 하거나 여러 개의 셀로 나눌 수 있다.

중첩된 레이아웃을 사용
// Widget 클래스의 생성자, 선택적으로 부모 위젯을 QWidget의 생성자로 전달
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
// 수평 박스 레이아웃(HBox)을 생성
QHBoxLayout *hboxLayout = new QHBoxLayout();
// 6개의 QPushButton 포인터 배열 생성
QPushButton *btn[6];
// 버튼 레이블을 저장하는 QString 배열
QString btnStr[6] = {"One", "Two", "Three", "Four", "Six", "Seven"};
// 6개의 QPushButton 객체를 생성하고 수평 레이아웃에 추가
for(int i = 0 ; i < 6 ; i++)
{
// btnStr 배열에서 버튼 레이블을 사용하여 각 버튼을 초기화
btn[i] = new QPushButton(btnStr[i]);
// 버튼을 수평 레이아웃에 추가
hboxLayout->addWidget(btn[i]);
}
// 수직 박스 레이아웃(VBox)을 생성
QVBoxLayout *vboxLayout = new QVBoxLayout();
// 6개의 QPushButton 포인터 배열 생성
QPushButton *vbtn[6];
// 수직 버튼 레이블을 저장하는 QString 배열
QString vbtnStr[3] = {"Movie", "Drama", "Animation"};
// 3개의 QPushButton 객체를 생성하고 수직 레이아웃에 추가
for(int i = 0 ; i < 3 ; i++)
{
// vbtnStr 배열에서 버튼 레이블을 사용하여 각 버튼을 초기화
vbtn[i] = new QPushButton(vbtnStr[i]);
// 버튼을 수직 레이아웃에 추가
vboxLayout->addWidget(vbtn[i]);
}
// 그리드 레이아웃을 생성
QGridLayout *gridLayout = new QGridLayout();
// 5개의 QPushButton 포인터 배열 생성
QPushButton *gbtn[5];
// 5개의 QPushButton 객체 생성
for(int i = 0 ; i < 5 ; i++)
{
// btnStr 배열에서 레이블을 사용하여 버튼을 초기화 (수평 버튼 레이블 재사용)
gbtn[i] = new QPushButton(btnStr[i]);
}
// 버튼을 그리드 레이아웃의 특정 위치에 추가
gridLayout->addWidget(gbtn[0], 0, 0); // 위치 (0, 0)
gridLayout->addWidget(gbtn[1], 0, 1); // 위치 (0, 1)
gridLayout->addWidget(gbtn[2], 1, 0, 1, 2); // 위치 (1, 0), 2개의 열을 차지
gridLayout->addWidget(gbtn[3], 2, 0); // 위치 (2, 0)
gridLayout->addWidget(gbtn[4], 2, 1); // 위치 (2, 1)
// 기본 수직 레이아웃을 생성하여 세 가지 레이아웃을 결합
QVBoxLayout *defaultLayout = new QVBoxLayout();
// 수평 레이아웃(HBox)을 기본 레이아웃에 추가
defaultLayout->addLayout(hboxLayout);
// 수직 레이아웃(VBox)을 기본 레이아웃에 추가
defaultLayout->addLayout(vboxLayout);
// 그리드 레이아웃을 기본 레이아웃에 추가
defaultLayout->addLayout(gridLayout);
// 이 위젯에 기본 레이아웃을 설정
setLayout(defaultLayout);
}
// Widget 클래스의 소멸자
Widget::~Widget()
{
// 동적으로 할당된 메모리가 없기 때문에 비어있는 소멸자
}

'Qt프로그램' 카테고리의 다른 글
| Qt Designer 를 이용한 GUI 설계 (3) | 2024.10.08 |
|---|---|
| Signal and Slot (1) | 2024.10.08 |
| Qt GUI widgets(2) (1) | 2024.10.08 |
| Qt GUI Widgets (0) | 2024.10.07 |
| qmake / CMake / console / GUI (0) | 2024.10.07 |
댓글