2강부터는 1강의 Intro 에서 설명했었던 방식에서 Plugin 을 활용하여 Custom Widget을 개발하는 방법을 설명하겠습니다. 우선 기본 프로젝트를 생성하고 ui 파일을 등록하는 방법을 설명하도록 하겠습니다.
1. Plugin 프로젝트 만들기
Visual studio에서 새로운 프로젝트를 Qt Designer Custom Widget template를 이용해서 생성합니다.
우선 새로운 솔루션과 프로젝트를 생성합니다.
QtWidgetTutorial 솔루션을 만들고 이 솔루션에 계속 이어질 프로젝트들을 연결할 예정입니다.
Widget Wizard 를 보면 아래의 Widget을 위한 클래스와 Plugin 클래스가 생성되는 것을 확인할 수 있습니다.
생성된 프로젝트의 파일 구조를 보면 자동으로 MyWidget클래스와 Plugin 명칭이 붙은 클래스 파일이 생성됩니다.
4. 프로젝트 속성 변경하기
Qt VS Tool에서 Qt 프로젝트를 생성해서 바로 빌드를 하면 에러가 발생합니다. Qt Creator 를 이용해서는 기본 c++ 11 버전으로 사용할 수 있는데 이상하게 VS에서는 오류가 발생해서 이를 해결해야 합니다.
- C++ Language Standard 를 C++ 17로 변경합니다
- 빌드 속성을 추가 합니다 /Zc:__cplusplus
4. UI 파일 생성 및 연결하기
앞에서 plugin 프로젝트를 생성하였지만 ui 파일은 자동으로 생성되지 않았습니다.
widget 클래스의 paint 함수를 override해서 직접 코드로 만들어서 구현할 수 있지만 우리가 원하는 건 편하게 ui 파일을 이용해서 쉽게 디자인 해서 사용하는 것입니다.
그럼 이제 Add New Item 에서 ui 파일을 생성합니다.
만들어진 ui 파일을 designer에서 원하는 형태로 디자인을 구성합니다.
간단하게 label 과 pushbutton 을 추가했습니다.
그리고 최상단 Widget의 이름을 클래스 이름과 동일하게 맞춰줍니다.
이 과정은 필요없으나, 클래스의 명칭과 동일하게 하는 것이 앞으로 연결하는 클래스들과의 가독성 부분에서 편하다고 생각해서 입니다.
그리고 Solution Explorer 에서 ui 파일을 분리할 Forms 폴더를 생성하고 만든 ui 파일을 이동시켜 놓습니다.
4. UI 파일 연결하기
UI 파일을 연결에 대한 내용을 말하기에 앞서 알아두면 좋은 것은 Qt 프로젝트를 빌드하게 되면 컴파일 단계에서 우선적으로 uic 컴파일러를 이용해서 ui 파일에 대한 header 파일을 생성합니다.
실제적으로 ui 파일은 xml 파일이지만 uic 를 이용해서 코드에서 사용할 수 있도록 하게 됩니다.
이런 내용을 미리 알고 다음 설명을 들으면 흐름을 잡기 쉬울 것 입니다.
QtMyWidget 클래스에 uic 컴파일러에서 생성한 ui 클래스를 연결하기 위해 QtMyWidget.h 파일을 다음과 같이 작성합니다.
<QtMyWidget.h>
namespace Ui { class QtMyWidget; };
class QtMyWidget : public QWidget
{
Q_OBJECT
public:
QtMyWidget(QWidget *parent = Q_NULLPTR);
private:
Ui::QtMyWidget* ui;
};
보면 ui 클래스를 사용하기 위해서 forward 선언을 해서 ui 객체를 선언했습니다.
그리고 QtMyWidget 클래스 생성자에서 ui 객체를 생성하고 QtMyWidget 객체를 parent로 연결합니다.
<QtMyWidget.cpp>
#include "QtMyWidget.h"
#include "ui_MyWidget.h"
QtMyWidget::QtMyWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::QtMyWidget)
{
ui->setupUi(this);
}
참고 : Using a Designer UI File in Your C++ Application | Qt Designer Manual
5. Dynamic library 설정하기 연결하기
Plugin 프로젝트를 외부 프로젝트에서 사용하게 하는 방법은 shared dll 과 static dll 이 있습니다. Qt 공식 문서에 따르면 shared dll (dynamic dll)방식을 사용하는 것이 추천하는 방법으로 설명하고 있으며, 필자 또한 static library 비선호하는 편이라서 shared dll 방식으로 설명하겠습니다.
QtMyWidget.h 파일에서 클래스의 __dllexport 를 정의해주어야 합니다.
Qt에서는 관련 macro를 제공하고 있어 header파일과 QDESIGNER_WIDGET_EXPORT 선언을 을 아래와 같이 합니다.
#include <QtUiPlugin/QDesignerExportWidget>
class QDESIGNER_WIDGET_EXPORT QtMyWidget : public QWidget
그리고 프로젝트의 속성에서 Configuration type이 Dynamic Library(.dll)로 되어 있는지를 확인합니다. 프로젝트 default 이므로 변경할 필요는 없을 것입니다.
C/C++ 전처리 선언에 QDESIGNER_WIDGET_EXPORT 을 추가합니다.
Plugin Widget을 사용하기 필요한 가장 기본적인 구성은 완료했습니다.
그럼 다음 시간에는 만든 widget을 designer 이용해서 추가하면서 자동으로 생성된 MyWidgetPlugin 클래스에 대한 간단한 사용법을 설명하도록 하겠습니다.
참고: Creating Shared Libraries | Qt 6.2