2016. 4. 12. 01:40

0081 - 수직 / 수평 레이아웃 지정

참고 영상

QT Designer 를 쓰지 않고 QT 내 라이브러리를 사용하여 기본 위젯들을 C++ 코드 상에서 레이아웃 위젯에 의해 묶어서 사용하는 방법을 알아 봅니다.

1. 새 Project 를 만듭니다.

New File or Project 

- Application

- Qt Widgets Application 을 선택합니다.

- Introduction and Project Location 에서는 임의로 Project 명과 저장할 장소를 입력합니다.

- Kits 은 기존에 사용하시던 Kit 를 이용하시면 됩니다. (제 경우는 Desktop QT 5.5 MinGW 32bit)

- Class Information 는 나중에 삭제 할 거지만 MainWindow 를 그대로 사용합니다.

2. 생성한 Projects 에서 다음의 파일들을 삭제합니다.

- mainwindow.h, mainwindow.cpp, mainwindow.ui

- 오른쪽 마우스 버튼을 누르고 Remove File... 을 선택합니다.

- 기존에 저장된 파일까지 영구적으로 삭제한다는 Delete file permanently 를 선택하고 OK 를 선택합니다.

- 삭제된 파일이 QT Creator 에서 열려 있는 경우 삭제시 열린 창의 내용을 저장할건지 그대로 둘건지 선택을 합니다. 이때는 Close 를 선택합니다.

3. Code 를 수정합니다.

- mainwindow.h 는 삭제 되었으므로 이를 참조하는 구문은 삭제합니다.

- 단순히 Window 형의 Widget 을 추가하기 위해 다음의 Code 를 입력합니다.

1
2
3
4
5
6
7
8
9
#include <QApplication>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 
    return a.exec();
}
 
cs

- 실행하여 결과를 확인 합니다.

4. 추가 Widget 과 이들 간의 Layout 을 지정합니다.

- 추가할 QPushButton 객체들을 수평으로 볼려면 다음의 방법을 사용합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <QApplication>
#include <QPushButton>
#include <QHBoxLayout>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 
    QWidget *window = new QWidget;
 
    window->setWindowTitle("My App");
 
    QPushButton *button1 = new QPushButton("one");
    QPushButton *button2 = new QPushButton("two");
    QPushButton *button3 = new QPushButton("three");
 
    QHBoxLayout *hlayout = new QHBoxLayout;
    hlayout->addWidget(button1);
    hlayout->addWidget(button2);
    hlayout->addWidget(button3);
 
    window->setLayout(hlayout);
    window->show();
 
    return a.exec();
}
cs

- 반대로 수직으로 볼려면 다음의 방법을 사용하면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 
    QWidget *window = new QWidget;
 
    window->setWindowTitle("My App");
 
    QPushButton *button1 = new QPushButton("one");
    QPushButton *button2 = new QPushButton("two");
    QPushButton *button3 = new QPushButton("three");
 
    QVBoxLayout *vlayout = new QVBoxLayout;
    vlayout->addWidget(button1);
    vlayout->addWidget(button2);
    vlayout->addWidget(button3);
 
    window->setLayout(vlayout);
    window->show();
 
    return a.exec();
}
cs

5. QT 는 상위 개체가 삭제가 되면 하위로 엮여 있는 객체들까지 삭제하는 Routine (루틴) 이 포함되어 있으므로 이 경우에는 따로 Delete 를 할 필요가 없습니다.

자세한 사항은 https://stackoverflow.com/questions/8000249/qt-widget-memory-management 과 엮여 있는 Object Trees & Ownership 을 참고 하시기 바랍니다.

6. 만약에 Layout 을 넣지 않고 직접 Widget 을 표시하려면 다음의 Code 를 사용하시면 됩니다. 아래 예는 button3 에 대한 예외적 표시 입니다.

1
2
3
button3->setParent(window);
button3->setGeometry(10,30,50,30);
button3->show();
cs

작업 파일 받기

008_HVLayout.zip