기본 레이아웃 예제
표준 레이아웃 관리자를 사용하는 방법을 보여줍니다.
기본 레이아웃은 Qt에서 사용할 수 있는 표준 레이아웃 관리자를 사용하는 방법을 보여줍니다: QBoxLayout, QGridLayout, QFormLayout 을 사용합니다.
QBoxLayout 클래스는 위젯을 가로 또는 세로로 정렬합니다. QHBoxLayout 과 QVBoxLayout 는 QBoxLayout 의 편리한 서브 클래스입니다. QGridLayout 는 사용 가능한 공간을 행과 열로 나누어 셀에 위젯을 배치합니다. QFormLayout 반면에 , 는 왼쪽 열에 레이블이 있고 오른쪽 열에 입력 필드가 있는 두 열 형태로 자식을 설정합니다.
자세한 내용은 레이아웃 관리 페이지를 참조하세요.
예제 실행하기
에서 예제를 실행하려면 Qt Creator에서 Welcome 모드를 열고 Examples 에서 예제를 선택합니다. 자세한 내용은 예제 빌드 및 실행하기를 참조하세요.
대화 상자 클래스 정의
class Dialog : public QDialog { Q_OBJECT public: Dialog(); private: void createMenu(); void createHorizontalGroupBox(); void createGridGroupBox(); void createFormGroupBox(); enum { NumGridRows = 3, NumButtons = 4 }; QMenuBar *menuBar; QGroupBox *horizontalGroupBox; QGroupBox *gridGroupBox; QGroupBox *formGroupBox; QTextEdit *smallEditor; QTextEdit *bigEditor; QLabel *labels[NumGridRows]; QLineEdit *lineEdits[NumGridRows]; QPushButton *buttons[NumButtons]; QDialogButtonBox *buttonBox; QMenu *fileMenu; QAction *exitAction; };
Dialog
클래스는 QDialog 을 상속합니다. 지오메트리 관리자를 사용하여 자식 위젯을 표시하는 사용자 정의 위젯입니다: QHBoxLayout, QVBoxLayout, QGridLayout, QFormLayout 을 사용합니다.
클래스 생성자를 단순화하기 위한 네 가지 비공개 함수가 있습니다: createMenu()
, createHorizontalGroupBox()
, createGridGroupBox()
, createFormGroupBox()
함수는 예제에서 레이아웃이 모양에 미치는 영향을 보여주기 위해 사용하는 여러 위젯을 생성합니다.
다이얼로그 클래스 구현
Dialog::Dialog()
{
createMenu();
createHorizontalGroupBox();
createGridGroupBox();
createFormGroupBox();
생성자에서는 먼저 createMenu()
함수를 사용하여 메뉴 표시줄을 만들고 채우고 createHorizontalGroupBox()
함수를 사용하여 가로 레이아웃의 버튼 4개가 포함된 그룹 상자를 만듭니다. 다음으로 createGridGroupBox()
함수를 사용하여 그리드 레이아웃으로 표시되는 여러 줄 편집과 작은 텍스트 편집기가 포함된 그룹 상자를 만듭니다. 마지막으로 createFormGroupBox()
함수를 사용하여 세 개의 레이블과 세 개의 입력 필드(줄 편집, 콤보 상자, 회전 상자)가 있는 그룹 상자를 만듭니다.
bigEditor = new QTextEdit; bigEditor->setPlainText(tr("This widget takes up all the remaining space " "in the top-level layout.")); buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
또한 큰 텍스트 편집기와 대화 상자 버튼 상자를 만듭니다. QDialogButtonBox 클래스는 현재 위젯 스타일에 적합한 레이아웃으로 버튼을 표시하는 위젯입니다. 기본 설정 버튼은 QDialogButtonBox::StandardButtons 열거형을 사용하여 생성자에 대한 인수로 지정할 수 있습니다.
위젯을 만들 때 위젯의 부모를 지정할 필요가 없다는 점에 유의하세요. 그 이유는 여기서 만드는 모든 위젯이 레이아웃에 추가되고 레이아웃에 위젯을 추가하면 레이아웃이 설치된 위젯에 자동으로 부모가 다시 지정되기 때문입니다.
QVBoxLayout *mainLayout = new QVBoxLayout;
기본 레이아웃은 QVBoxLayout 객체입니다. QVBoxLayout 은 세로 방향의 박스 레이아웃을 위한 편의 클래스입니다.
일반적으로 QBoxLayout 클래스는 부모 레이아웃 또는 부모 위젯에서 얻은 공간을 가져와 일련의 상자로 나눈 다음 관리되는 각 위젯이 하나의 상자를 채우도록 합니다. QBoxLayout 의 방향이 Qt::Horizontal 인 경우 상자가 일렬로 배치됩니다. 방향이 Qt::Vertical 인 경우 상자는 열에 배치됩니다. 해당 편의성 클래스는 각각 QHBoxLayout 와 QVBoxLayout 입니다.
mainLayout->setMenuBar(menuBar);
QLayout::setMenuBar() 함수를 호출하면 레이아웃은 제공된 메뉴 표시줄을 부모 위젯의 상단과 위젯의 content margins 외부에 배치합니다. 모든 자식 위젯은 메뉴 표시줄의 하단 가장자리 아래에 배치됩니다.
mainLayout->addWidget(horizontalGroupBox); mainLayout->addWidget(gridGroupBox); mainLayout->addWidget(formGroupBox); mainLayout->addWidget(bigEditor); mainLayout->addWidget(buttonBox);
QBoxLayout::addWidget() 함수를 사용하여 레이아웃 끝에 위젯을 추가합니다. 각 위젯은 최소 크기와 최대 크기를 갖습니다. addWidget () 함수에서 스트레치 계수를 지정할 수 있으며, 이 스트레치 계수에 따라 초과 공간이 공유됩니다. 지정하지 않으면 위젯의 스트레치 계수는 0이 됩니다.
setLayout(scrollLayout);
setWindowTitle(tr("Basic Layouts"));
}
QWidget::setLayout() 함수를 사용하여 Dialog
위젯에 기본 레이아웃을 설치하면 레이아웃의 모든 위젯이 자동으로 Dialog
위젯의 자식으로 다시 부모를 지정합니다.
void Dialog::createMenu() { menuBar = new QMenuBar; fileMenu = new QMenu(tr("&File"), this); exitAction = fileMenu->addAction(tr("E&xit")); menuBar->addMenu(fileMenu); connect(exitAction, &QAction::triggered, this, &QDialog::accept); }
비공개 createMenu()
함수에서 메뉴 모음을 만들고 Exit 옵션이 포함된 풀다운 File 메뉴를 추가합니다.
void Dialog::createHorizontalGroupBox() { horizontalGroupBox = new QGroupBox(tr("Horizontal layout")); QHBoxLayout *layout = new QHBoxLayout; for (int i = 0; i < NumButtons; ++i) { buttons[i] = new QPushButton(tr("Button %1").arg(i + 1)); layout->addWidget(buttons[i]); } horizontalGroupBox->setLayout(layout); }
가로 그룹 상자를 만들 때 내부 레이아웃으로 QHBoxLayout 을 사용합니다. 그룹 상자에 넣을 버튼을 만들고 레이아웃에 추가한 다음 그룹 상자에 레이아웃을 설치합니다.
void Dialog::createGridGroupBox() { gridGroupBox = new QGroupBox(tr("Grid layout"));
createGridGroupBox()
함수에서는 위젯을 그리드에 배치하는 QGridLayout 을 사용합니다. 이 함수는 상위 레이아웃 또는 상위 위젯에 의해 사용 가능한 공간을 가져와 행과 열로 나누고 관리하는 각 위젯을 올바른 셀에 배치합니다.
for (int i = 0; i < NumGridRows; ++i) { labels[i] = new QLabel(tr("Line %1:").arg(i + 1)); lineEdits[i] = new QLineEdit; layout->addWidget(labels[i], i + 1, 0); layout->addWidget(lineEdits[i], i + 1, 1); }
그리드의 각 행에 대해 레이블과 관련 줄 편집을 생성하고 레이아웃에 추가합니다. QGridLayout::addWidget () 함수는 QBoxLayout 의 해당 함수와 다릅니다. 위젯을 넣을 그리드 셀을 지정하는 행과 열이 필요합니다.
smallEditor = new QTextEdit; smallEditor->setPlainText(tr("This widget takes up about two thirds of the " "grid layout.")); layout->addWidget(smallEditor, 0, 2, 4, 1);
QGridLayout::addWidget() 함수는 셀이 포함될 행과 열의 개수를 지정하는 인수를 추가로 받을 수 있습니다. 이 예에서는 세 개의 행과 하나의 열에 걸쳐 있는 작은 편집기를 만듭니다.
QBoxLayout::addWidget() 및 QGridLayout::addWidget() 함수 모두 위젯의 정렬을 지정하는 마지막 인수를 추가할 수도 있습니다. 기본적으로 위젯은 전체 셀을 채웁니다. 하지만 예를 들어 정렬을 Qt::AlignRight 으로 지정하여 위젯을 오른쪽 가장자리에 정렬할 수 있습니다.
layout->setColumnStretch(1, 10); layout->setColumnStretch(2, 20); gridGroupBox->setLayout(layout); }
그리드 레이아웃의 각 열에는 스트레치 계수가 있습니다. 스트레치 계수는 QGridLayout::setColumnStretch()를 사용하여 설정하며 열이 필요한 최소 공간을 초과하여 얼마나 많은 공간을 확보할지 결정합니다.
이 예에서는 열 1과 2에 대한 스트레치 계수를 설정했습니다. 스트레치 계수는 이 그리드의 다른 열에 상대적이며, 스트레치 계수가 높은 열은 사용 가능한 공간을 더 많이 차지합니다. 따라서 그리드 레이아웃의 2열은 1열보다 사용 가능한 공간을 더 많이 차지하게 되며, 0열은 스트레치 계수가 0(기본값)이므로 전혀 늘어나지 않습니다.
열과 행은 동일하게 동작하며, 행에도 동일한 스트레치 계수가 있으며 QGridLayout::setRowStretch() 함수가 있습니다.
void Dialog::createFormGroupBox() { formGroupBox = new QGroupBox(tr("Form layout")); QFormLayout *layout = new QFormLayout; layout->addRow(new QLabel(tr("Line 1:")), new QLineEdit); layout->addRow(new QLabel(tr("Line 2, long text:")), new QComboBox); layout->addRow(new QLabel(tr("Line 3:")), new QSpinBox); formGroupBox->setLayout(layout); }
createFormGroupBox()
함수에서는 QFormLayout 을 사용하여 개체를 이름과 필드라는 두 개의 열로 깔끔하게 정렬합니다. 이름에는 QLineEdit, QComboBox, QSpinBox 등 세 개의 입력 위젯을 필드로 하는 세 개의 QLabel 객체가 있습니다. QBoxLayout::addWidget() 및 QGridLayout::addWidget()와 달리 QFormLayout::addRow()를 사용하여 레이아웃에 위젯을 추가합니다.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.