Qt프로그램

Layout

Barbarian developer 2024. 10. 8.

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

댓글