본 문서는 QDockwidget을 이용하여 프로그램을 개발하던 중, 프로그램을 재시작 하였을 때 현재 설정된 DockWidget의 상태(현시여부, 도킹위치, 크기 등)를 저장하고 불러오는 방법에 대해 리서치 및 시도한 것들을 정리하여 기록한 문서다.
Document 및 웹 서칭을 통해서 시도해본 것들은 다음과 같다.
첫번째로 QDockWidget의 saveGeometry(), restoreGeometry() 메서드를 이용, Geometry정보를 지정하여 DockWidget의 위치를 조절하는 방식이다.
위와 같은 방식으로 처리를 하였으나, geometry 는 x, y, width, height 정보만을 저장하고 있으며, 도킹된 위치나 show/hide여부 등을 처리하지 못한다는 문제점이 존재한다.
이를 해결하기 위해 두번째 방식으로, 직접 Dockwidget의 상태들을 가져와서 처리하는 방식이다.
다음과 같은 상태 정보들을 직접 관리를 해야하는데,
- 현재 Docking된 위치
- Show/Hide 상태
- Widget의 Size
- Tab순서
- ...
이러한 정보들을 가져오기 위해서는 다음 방법들을 통해데이터를 가져온다.
- DockWidget의 위치
- Get : Qt::DockWidgetArea dockWidgetArea(QDockWidget *dockwidget) const;
- Set : ???
- Show/Hide 상태
- Get : QDockWidget::isHidden()
- Set : QDockWidget::hide(), QDockWidget::show()
- Widget의 Size 정보
- QDockWidget::geometry()
- Tab 순서
- ????
- ...
이러한 방식은 직접적으로 관리해야할 데이터가 많아지며, 정확한 동작을 위해 처리해야할 동작들이 많아지는 단점이 있다.
또한, QT에서 기능을 제공하지 않거나, 관련 메서드 등을 찾지 못할 경우 구현이 불가능하다는 단점이 존재한다.
그래서 더 많은 자료들을 조사해 본 결과
세번째 방식으로, QMainFrame::saveState(), QMainFrame::restoreState() 메서드를 이용하여 처리하도록 구현했다.
조사해본 바로, MainWindow에서의 Docking Area에 대한 처리 뿐만 아니라 QToolBar와 QDockWidget의 상태들까지 저장해준다고 한다.
단, 저장할 대상이 될 QDockWidget과 QToolBar 객체에 Unique한 Object Name을 설정해줘야 한다고 명시되어있다.
QMainWindow::saveState()
https://doc.qt.io/qt-5/qmainwindow.html#saveState
QMainWindow::restoreState()
https://doc.qt.io/qt-5/qmainwindow.html#restoreState
이를 이용하여 작성한 간단한 예제 코드는 다음과 같다.
예제 코드에서, mainwindow의 geometry 정보까지 저장함으로써, 현재 Window의 위치 및 DockWidget들의 상태 정보까지 한번에 저장되었다.
이는 프로그램 실행 및 종료시에 restore/save를 수행함으로서 마지막 상태를 저장하고 불러올 수 있다.
두번째 방법처럼 직접 모든 상태를 저장하지 않아도 되며, 몇줄의 코드로 처리 할 수 있다.
QT는 UI를 관리하기 위해 많은 양의 기능들을 제공한다. 때로는 이미 구현된 기능만 가지고 구현하기 어려운 부분들이 존재하지만, 기본적으로 직접 구현하지 않아도 수준급의 기능을 프로그램에 적용할 수 있다는 것을 알게 되었다.
직접 구현을 해야 하는 부분과, 그렇지 않아도 되는 부분을 조금 더 명확하게 파악하기 위해선, Framework에 대해 더 깊은 이해가 필요함을 깨닫게 되었다.
'Programming > QT' 카테고리의 다른 글
[QT] QOCI를 이용한 CLOB 데이터 insert중 ORA-03113 (EOF) 오류 발생 대처법 (0) | 2021.06.30 |
---|---|
[QT] CentOS 7 환경에서 QOCI (Oracle DB) Driver 빌드 (0) | 2021.06.28 |
[QT] static assertion failed: Type is not registered, please use the Q_DECLARE_METATYPE (0) | 2019.06.25 |
[QT] C++ std::string과 QString 간의 문자열 형 변환 방법 (0) | 2019.06.18 |
[QT] QObject::connect: Cannot queue arguments of type 'Type Name' (0) | 2019.06.12 |
[QT] QByteArray를 QJsonValue로 변환하기 (0) | 2019.05.16 |
[QT] 프로그램 실행 시 모니터 지정 및 풀스크린 실행 (0) | 2019.05.09 |
[QT] QPixmap에서 image를 로드할 때 Segmentation fault가 뜨는 이유 (0) | 2019.04.06 |