이번 강의에서는 Application 에서 plugin 을 ui 을 사용하는 방법에 대해 알아보도록 하겠습니다.
1. Application 환경 구축
Designer에서 만든 Widget을 추가해서 App ui파일에 그리는 것까지 했습니다. 하지만, 프로젝트 빌드를 해보면 컴파일 에러가 나옵니다.
기본적으로 library 를 사용하려면 header 참조를 찾아야 하는데 ui_QtMyApp.h 파일에서 우리가 만든 plugin library 의 header를 참조하지 못해서 컴파일 에러가 발생했습니다.
일반적으로 library 프로젝트와 app 프로젝트가 같은 솔루션에 있기 때문에 상대 경로를 이용해서 header를 연결하면 될 수 있지만 이런 방법은 shared dll library 를 활용하는 방법으로는 적합하지 않다고 개인적으로 생각합니다.
header를 참조하는 방법은 개발자마다의 선호도에 따른 것이겠지만 현재의 환경에서는 적합하지 않은 방식입니다.
왜냐면, 2강에서 잠깐 언급한대로 ui 파일은 우리가 만드는 파일이 아니라 UIC 컴파일러가 빌드 과정에서 생성된 파일이기 때문에 우리가 상대경로를 지정하거나 할 수가 없습니다.
따라서, 프로젝트의 속성을 이용해야 합니다. 프로젝트 속성 -> C/C++ -> Additional Include Directories 에 header 파일이 있는 경로를 지정합니다.
저는 plugin 프로젝트의 폴더를 지정하고 싶지 않기 때문에 솔루션에 Include 폴더를 생성하고 이를 상대경로로 지정하였습니다. Include 폴더는 나중에도 사용될 예정이기 때문에 이 방법을 추천합니다.
그리고 지정한 경로에 MyQtWidget.h 를 복사해 넣습니다.
이번엔 Library 파일을 입력합니다. 우선 Linker -> General -> Additional Library Directories 에서 QtMyWidget.lib 파일이 있는 경로를 추가합니다. 저는 MyApp과 MyWidget 프로젝트의 output 경로가 동일하기 떄문에 $(OutputPath) 매크로를 추가했습니다.
Linker -> Input -> Additional Dependencies 에 QtMyWidget.lib 를 추가합니다.
2. Custom Widget 출력하기
프로젝트 설정을 완료하고 빌드하면 또 다시 컴파일 에러가 나옵니다.
우선 QtMyApp.ui 파일을 열고 Designer의 QtMyWidget의 objectName을 클래스 이름과 다른 이름으로 변경합니다.
기본 생성되는 객체이름이 클래스 이름과 동일해서 나는 에러입니다.
이제 프로젝트를 빌드하고 실행합니다. 정상적으로 실행되는 것을 확인 할 수 있습니다.
MyApp 을 실행해서 QtMyWidget이 연동되어서 나타나는 것까지 확인했습니다.
3. Custom Widget 제어하기
실제로 App을 개발하기 위해서는 Custom widget의 내부 child widget을 제어해야 합니다.
QtMyApp.cpp 에서 ui 객체에 추가된 custom widget의 객체를 접근해봅니다.
하지만, 실제로 우리가 원하는 label이나 button widget에 대한 멤버변수 정보가 보이지 않습니다.
Designer에서는 custom widget을 추가했더라고 child widget을 갖고 있는 MyWidget 클래스 정보가 없기 때문입니다.
Widget 정보를 얻기 위해 cpp 파일에 MyWidget 클래스의 ui header 파일을 추가합니다.
#include "ui_MyWidget.h" |
그리고 plugin 프로젝트 속성에서 Qt User Interface Compiler -> Output Directory 를 솔루션 Include 폴더로 변경합니다. 그러면 Widget 클래스를 빌드할 때마다 ui의 클래스 header 파일을 지정 위치에 저장하게 됩니다.
QtMyWidget.h 에 외부에서 접근 할 수 있도록 최상단 widget(window widget)의 Get 함수를 추가합니다.
public:
const Ui::QtMyWidget* GetUi() { return ui; }
QtMyApp.cpp 의 생성자에 custom widget 의 window widget에 접근해서 label의 text를 변경 코드를 넣습니다.
const Ui::QtMyWidget* cWidget = ui.qtMyWidget->GetUi();
cWidget->label->setText("New Custom Wiget Label");
실행하면 기존 label의 문구가 변경된 것을 확인할 수 있습니다.
다음 강의에서는 plugin 클래스의 QDesignerCustomWidgetInterface 을 이용해서 Designer 에 표시되는 custom widget의 속성 정보를 변경하는 방법을 알아보도록 하겠습니다.