QSplitter로 QT 창 나누기
QT 프레임워크를 사용하는 응용 프로그램을 개발하다가 창을 나누어 나름의 역할을 수행하도록 하는 필요를 만났다.
완성된 창 나누기 그림이다. 모든 영역은 경계선에 마우스를 올려두면 사용자가 크기를 조정할 수 있다. 먼저 전체 영역을 좌우로 나누고 각 영역을 상하로 나눈다. 그리고 우측 위쪽 영역을 다시 좌우로 나눈 결과이다. 간단히 "전체 - 좌(-상, 하), 우(-상[-좌, 우], 하)"로 정리할 수 있는데 구조적인 구성임을 알 수 있다. 구조적이라는 의미는 하부 요소는 상위 요소의 자식(Child) 요소로 지정되어야 한다는 의미다.
//Init splitter
splitter = new QSplitter(centralWidget());
splitter->setOrientation(Qt::Horizontal);
QSplitter *split_left = new QSplitter;
split_left->setOrientation(Qt::Vertical);
QSplitter *split_right = new QSplitter;
split_right->setOrientation(Qt::Horizontal);
QSplitter *split_bot = new QSplitter;
split_bot->setOrientation(Qt::Vertical);
//Left frame
CtrTree = new QTreeWidget(split_left);
CtrTree->setContextMenuPolicy(Qt::CustomContextMenu);
QFrame *monpnl = new QFrame(split_left);
//Right frame add
edittabs = new QTabWidget(split_right);
libtabs = new QTabWidget(split_right);
//Bottom frame add
split_bot->addWidget(split_right);
rsttabs = new QTabWidget(split_bot);
splitter->addWidget(split_left);
splitter->addWidget(split_bot);
QSplitter를 생성하면 좌우로 영역을 나눌 것이면 Qt::Horizontal, 상하로 나누려면 Qt::Vertical로 setOrientation()을 지정한다. QSplitter의 자식 노드로 분할될 영역에 들어갈 위젯을 지정하면 된다. 위의 예제에서는 각 분할 영역에 QTreeWidget, QFrame, QTabWidget과 같은 단일 위젯을 설정했지만, 여러 요소들을 배치해야 하는 경우에는 QWidget 생성하고 각 하부 요소들을 QWidget의 자식 노드로 추가하고 QWidget에 QVBoxLayout과 같은 레이아웃을 설정한 다음 QWidget을 QSplitter의 자식 노드로 추가하면 된다.
QSplitter의 자식 노드로 위젯을 추가하는 방법은 QSplitter의 addWidget()을 사용해도 되고 위젯 생성 시 부모 노드를 QSplitter 인스턴스를 지정하는 방식으로 해도 된다. 다만, 주의할 것은 순서에 따라 좌우 또는 상하가 결정된 다는 점과 구조상 최상위 노드가 맨 마지막에 설정된다는 점을 기억해야 한다.
QList<int> splSz;
splSz.push_back(200);
splSz.push_back(800);
splitter->setSizes(splSz);
splSz[0] = 500;
splSz[1] = 100;
split_bot->setSizes(splSz);
splSz[0] = 300;
splSz[1] = 300;
split_left->setSizes(splSz);
splSz[0] = 600;
splSz[1] = 200;
split_right->setSizes(splSz);
QSplitter로 나누어진 영역의 기본 크기를 설정하려면 위와 같이 QList 형태로 상하 또는 좌우 픽셀 값을 차례대로 입력하여 setSizes()의 인수로 전달하면 된다.
QByteArray st = splitter->saveState();
//......
splitter->restoreState(settings.value("splitterSizes").toByteArray());
QSplitter로 나누어진 영역의 크기를 저장 및 복원하려면 위와같이 saveState()와 restoreState()를 사용하면 된다.