본문 바로가기

Qt/라이브러리

Visual Studio 스타일 도킹 윈도우: Advanced Docking System for Qt

 

Advanced Docking System for Qt

Qt Advanced Docking System lets you create customizable layouts using a full featured window docking system similar to what is found in many popular integrated development environments (IDEs) such as Visual Studio. Everything is implemented with standard Q

marketplace.qt.io

  • 라이선스: LGPL 2.1
  • 테스트 환경: Windows 10 Home 22H2 64-bit, Qt 6.5.0, Qt Creator 11.0.1, MinGW 11.2.0 64-bit

제목 그대로 Visual Studio 스타일의 도킹 윈도우를 제공함. 2020년 즈음에 Qt 마켓 플레이스를 돌아 댕기다 발견함. 깃헙 저장소에서 readme 파일을 읽다 Showcase에 Qt Quick Designer, Qt Design Studio에 적용되었다는 글을 읽고 바로 다운로드받아 지금까지 잘 사용하고 있음.

라이브러리 사용하기: qmake 프로젝트

소스 코드를 빌드해서 사용하기

응용 프로그램에 Qt ADS의 소스 코드를 포함시키려면 ads 프로젝트와 그 하위 프로젝트인 demo, examples의 내용을 참고하자. Qt ADS를 사용하는 간단한 프로젝트를 만들어 보자. 프로젝트 이름을 QtAdsTest로 정하고 프로젝트 파일을 아래와 같이 작성하자.

TEMPLATE = subdirs
SUBDIRS = \
    ads \
    adsTest
adtTest.depends = ads

프로젝트는 Qt ADS 소스 코드가 있는 ads 폴더와 이를 사용하는 adsTest 폴더로 구성된다. 즉 adsTest 프로젝트가 실질적인 클라이언트 프로젝트이다. 이런 구성의 프로젝트는 그 하위 폴더에 개별 프로젝트 파일이 있어야 한다. 그리고 adsTest 프로젝트는 Qt ADS를 사용하기 때문에 ads 프로젝트가 먼저 빌드 되어야 한다. 자세한 사항은 SUBDIRS - handling dependencies를 참조하자.

ads 프로젝트는 Qt ADS 소스 코드의 src 폴더를 가져와 이름만 바꾼 것이다. 달리 손댈 것은 없다. adsTest 프로젝트 파일의 내용은 아래와 같다.

QT += \
    widgets
SOURCES += \
    main.cpp \
    mainwindow.cpp
HEADERS += \
    mainwindow.h
LIBS += -L$$OUT_PWD/../lib -lqtadvanceddocking
INCLUDEPATH += $$PWD/../ads
DEPENDPATH += $$PWD/../ads

아래 세 줄이 클라이언트 코드가 Qt ADS를용하게 해준다. Qt ADS는 라이브러리로 빌드되므로 이를 클라이언트 프로젝트가 사용한다. 외부 라이브러리를 사용하는 방법에 대해서는 Qt/Qt Creator에서 외부 라이브러리 사용하기를 참조하자.

adsTest 프로젝트의 클라이언트 코드는 Qt ADS의 Getting started / Example과 크게 다르지 않다. mainwindow.h 파일을 아래와 같이 작성하자. 코드에 대한 설명은 주석으로 대신한다.

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include "DockManager.h"    // Qt ADS를 사용하기 위한 헤더 파일
#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);

protected:
    /* dockManager 리소스를 해제하기 위해 오버라이드 함 */
    virtual void closeEvent(QCloseEvent *event) override;

private:
    /* 도킹 윈도우를 관리할 컨테이너 */
    ads::CDockManager *dockManager;
};

#endif // MAINWINDOW_H

mainwindow.cpp의 내용은 아래와 같다. 코드에 대한 설명은 주석으로 대신한다.

#include "mainwindow.h"

#include <QLabel>
#include <QMenuBar>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    /* 도킹 윈도우에 담을 컨텐츠 생성:
     * 어떤 위젯이라도 넣을 수 있음 */
    auto *label = new QLabel();
    label->setWordWrap(true);
    label->setAlignment(Qt::AlignTop | Qt::AlignLeft);
    label->setText(tr("<H1>Qt ADS Test</H1>"));

    /* 도킹 윈도우 생성:
     * 위에서 생성한 라벨을 대상 위젯으로 설정함 */
    auto *dockWidget = new ads::CDockWidget(tr("Label 1"));
    dockWidget->setWidget(label);

    /* dockWidget 토글 메뉴 생성 */
    menuBar()->addAction(dockWidget->toggleViewAction());

    /* 도킹 윈도우를 관리할 컨테이너 생성:
     * ui 파일을 사용한다면 이 코드는 반드시 ui->setupUi() 다음에 위치해야 함 */
    dockManager = new ads::CDockManager(this);
    /* dockWidget을 컨테이너에 추가 */
    dockManager->addDockWidget(ads::CenterDockWidgetArea, dockWidget);
}

void MainWindow::closeEvent(QCloseEvent *event)
{
    /* dockManager 삭제:
     * 포함되어 있는 dockWidget을 함께 삭제함 */
    dockManager->deleteLater();

    QMainWindow::closeEvent(event);
}

빌드후 실행하면 다음과 같은 결과를 볼 수 있다.

공유 라이브러리로 만들어 사용하기

앞서도 언급했지만 Qt ADS는 라이브러리로 빌드된다. 따라서 Qt ADS 소스 코드나 이전 에제 프로젝트를 빌드했다면 Qt ADS는 이미 공유 라이브러로 빌드 되어 있을 것이다. 공유 라이브러리로 빌드된 Qt ADS를 사용하는 것은  Qt/Qt Creator에서 외부 라이브러리 사용하기와 완전히 동일하다.

QtAdsLibTest라는 폴더를 만들고 다음 세 가지를 준비하자.

  1. 이전 프로젝트의 빌드 폴더에서 lib 폴더를 복사: libqtadvanceddocking.a와 qtadvanceddocking.dll 파일이 있음
  2. Qt ADS 소스 코드 src 폴더 혹은 이전 프로젝트의 ads 폴더에서 모든 헤더 파일을 lib 폴더로 복사
  3. 이전 프로젝트의 소스 코드를 모두 복사: main.cpp, mainwondow.cpp, mainwindow.h

프로젝트 이름을 QtAdsLibTest로 정하고 프로젝트 파일을 아래와 같이 작성하자. adsTest.pro 파일에서 제일 아래 세 줄, 라이브러리 경로 설정 부부만 수정한 것이다.

QT += \
    widgets
SOURCES += \
    main.cpp \
    mainwindow.cpp
HEADERS += \
    mainwindow.h
LIBS += -L$$PWD/lib -lqtadvanceddocking
INCLUDEPATH += $$PWD/lib
DEPENDPATH += $$PWD/lib

소스 코드는 손댈 필요 없다. 빌드 후 실행하면 이전과 같은 결과를 얻을 수 있다.