QT - Layout

구동엽
|2024. 7. 11. 16:58

서론

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

하지만 레이아웃을 이용하면 윈도우의 크기가 변경 될 때마다 동적으로 GUI 상에 위젯들의 크기도 동적으로 변하게 된다.

윈도우의 크기가 변경되면 레이아웃은 위젯들을 최적의 위치에 정렬되어 일관된 크기의 모양을 유지할 수 있도록 해준다.

다음 표는 QT에서 주로 사용되는 레이아웃 클래스들이다.

 

클래스 설명
QHBoxLayout 위젯들을 가로 방향으로 배치
QVBoxLayout 위젯들을 세로 방향으로 배치
QGridLayout 위젯을 그리드 또는 바둑판 스타일로 배치
QFormLayout 위젯을 2열로 배치하는 형식

 

QHBoxLayout

QHBoxLayout은 위젯들을 가로 방향으로 배치할 수 있다.

다음 코드와 같이 QPushButton 위젯을 addWidget() 멤버 함수를 이용해 추가할 수 있다.

 

widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{

    // Horizontal Layout
    QHBoxLayout *hboxLayout = new QHBoxLayout();
    QPushButton *hbtn[6];

    QString hbtnStr[6] = {"One", "Two", "Three", "Four", "Five", "Six"};
    for(int i=0; i<6; i++){
        hbtn[i] = new QPushButton(hbtnStr[i],this);
        hboxLayout->addWidget(hbtn[i]);
    }

    setLayout(hboxtLayout);
}

Widget::~Widget()
{
}

* 헤더파일에 #include <QHBoxLayout> 을 선언해줘야 사용할 수 있다.

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QHBoxLayout>
#include <QPushButton>

class Widget : public QWidget
{
    Q_OBJECT
    
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
};
#endif // WIDGET_H

 

 

QVBoxLayout

QVBoxLayout은 위젯을 세로 방향으로 배치할 수 있다.

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    // Vertical Layout
    QVBoxLayout *vboxLayout = new QVBoxLayout();
    QPushButton *vbtn[3];

    QString vbtnStr[3] = {"movie", "Drama", "Animation"};
    for(int i=0; i<3; i++){
        vbtn[i] = new QPushButton(vbtnStr[i],this);
        vboxLayout->addWidget(vbtn[i]);
    }

    setLayout(vboxLayout);
}

Widget::~Widget()
{
}

 

QGridLayout

QGridLayout은 바둑판 모양과 같은 스타일로 위젯을 배치할 수 있다.

QGridLayout은 특정 행을 하나의 위젯만 배치할 수 있도록 병합 하거나 여러 개의 셀로 나눌 수 있다.

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    // Grid Layout
    QGridLayout *gridLayout = new QGridLayout();
    QPushButton *gbtn[6];
    for(int i = 0 ; i < 5 ; i++){
        gbtn[i] = new QPushButton(hbtnStr[i],this);
    }

    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);

    setLayout(gridLayout);
}

Widget::~Widget()
{
}

 

 

중첩된 레이아웃을 사용

레이아웃 안에 레이아웃을 배치할 수 있다. 다음 코드는 QVBoxLayout안에 3가지 레이아웃을 배치한 코드이다.

 

widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{

    // Horizontal Layout
    QHBoxLayout *hboxLayout = new QHBoxLayout();
    QPushButton *hbtn[6];

    QString hbtnStr[6] = {"One", "Two", "Three", "Four", "Five", "Six"};
    for(int i=0; i<6; i++){
        hbtn[i] = new QPushButton(hbtnStr[i],this);
        hboxLayout->addWidget(hbtn[i]);
    }

    // Vertical Layout
    QVBoxLayout *vboxLayout = new QVBoxLayout();
    QPushButton *vbtn[3];

    QString vbtnStr[3] = {"movie", "Drama", "Animation"};
    for(int i=0; i<3; i++){
        vbtn[i] = new QPushButton(vbtnStr[i],this);
        vboxLayout->addWidget(vbtn[i]);
    }

    // Grid Layout
    QGridLayout *gridLayout = new QGridLayout();
    QPushButton *gbtn[6];
    for(int i = 0 ; i < 5 ; i++){
        gbtn[i] = new QPushButton(hbtnStr[i],this);
    }

    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);

    
    // Default Layout
    QVBoxLayout *defaultLayout = new QVBoxLayout();
    defaultLayout->addLayout(hboxLayout);
    defaultLayout->addLayout(vboxLayout);
    defaultLayout->addLayout(gridLayout);

    setLayout(defaultLayout);


}

Widget::~Widget()
{
}

 

'🌠Development > QT' 카테고리의 다른 글

QT - Signal and Slot (2)  (0) 2024.07.12
QT - Signal and Slot (1)  (0) 2024.07.11
QT - 계산기 만들기  (0) 2024.07.11
QT - 기본 코드 살펴보기  (1) 2024.07.05
QT - 프로그래밍의 시작  (0) 2024.07.05