반응형

본 문서는 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에 대해 더 깊은 이해가 필요함을 깨닫게 되었다.

반응형

댓글을 달아 주세요

  1. 비밀댓글입니다