지금까지 CustomWidget Plugin을 만들고 Application 프로그램에 만든 widget을 붙여서 실행하는 것까지 해왔습니다.
이번 시간에는 만든 widget plugin의 속성을 변경할 수 있는 interface에 대해서 알아보도록 하겠습니다.
1. QDesignerCustomWidgetInterface
2강에서 Qt Custom Widget 프로젝트를 만들 때 MyWidget 클래스와 함께 자동으로 MyWidgetPluin 클래스가 만들어졌었습니다. Plugin 클래스는 QDesignerCustomWidgetInterface 클래스를 상속한 자식 클래스입니다.
바로 이 시간에 알아볼 내용이 QDesignerCustomWidgetInterface 클래스 입니다. 짧게 interface 클래스로 부르겠습니다.
Interface클래스는 우리가 Qt Designer 에서 사용하는 widget에 대한 속성 정보를 지정해주는 interface를 갖고 있습니다.
여러 함수들이 있으나 필요한 부분들만 골라서 설명하고자 합니다. 그외 자세한 정보는 아래의 공식 페이지를 참고하시면 됩니다.
참고 : QDesignerCustomWidgetInterface Class | Qt Designer Manual
- name : Designer의 widget box에 표시되는 widget의 클래스이름입니다. 클래스명과 동일해야 합니다.
- groups : Widget이 속하는 그룹의 이름을 변경합니다.
- icon : widget의 좌측에 표시되는 아이콘을 변경합니다.
- isContainer : widget이 다른 widget을 품을 수 있는 container인지 여부를 지정합니다.
QtMyWidgetPlugin.cpp 의 내용을 변경해 봅니다.
QString QtMyWidgetPlugin::group() const
{
return "My Custom Widgets";
}
QIcon QtMyWidgetPlugin::icon() const
{
QPixmap iconImg(18, 18);
iconImg.fill(Qt::blue);
return QIcon(iconImg);
}
변경한 대로 Designer에서 표시도 변경된 것을 확인할 수 있습니다.
- domXml : widget의 속성 정보를 변경합니다. 이 내용은 다음장에서 알아보겠습니다.
3. Widget 속성 제어하기
이전 3강에서 언급했던 widget을 ui 에 배치할 때 child widget들이 보이지 않았던 문제와 4강에서 발생했던 객체 변수명 에러를 해결하는 방법을 설명하고자 합니다.
언급한 두가지 모두 Interface의 domXml 에서 해결 할 수 있습니다.
domXml 은 widget을 designer에서 사용되는 속성 정보를 변경하는데 사용됩니다.
QString QtMyWidgetPlugin::domXml() const
{
return "<widget class=\"QtMyWidget\" name=\"widget\">\n"
" <property name=\"geometry\">\n"
" <rect>\n"
" <x>0</x>\n"
" <y>0</y>\n"
" <width>670</width>\n"
" <height>470</height>\n"
" </rect>\n"
" </property>\n"
"</widget>\n";
}
xml 내용을 보면 class="클래스이름", name="변수명" 그리고 widget의 geometry 정보를 지정합니다.
클래스이름은 당연히 widget 클래스의 이름으로 해야하지만, name 변수명을 자동생성될 때는 클래스명으로 된것을 다른이름으로 변경하면 빌드오류를 사전에 예방할 수 있습니다.
그리고 geomtry 정보를 만든 widget의 사이즈로 맞춰서 미리 지정한다면 widget이 처음부터 잘 보이도록 할 수 있습니다. 그외 다른방법은 widget을 처음에 만들때 layout을 이용하여 사이즈가 자동으로 변경되도록 구속시켜서 표시되게 할 수도 있습니다.
Qt Layout에 자세한 내용은 공식 페이지를 참고하시면 쉽게 따라할 수 있습니다.
참고 : Layout Management | Qt Widgets 6.2.2
다음 강의에서는 메인 application 과 custom widget 간의 signal & slot 을 connect 하여 user interface를 구성하는 것을 다루도록 하겠습니다.