• 카테고리

    질문 & 답변
  • 세부 분야

    데스크톱 앱 개발

  • 해결 여부

    해결됨

qmlRegisterType을 매번 수동으로 입력해줘야 할까요?

23.06.11 23:13 작성 조회수 361

1

//새로운 QML타입을 구현하고, 이를 QML엔진에 등록

qmlRegisterType<Message, 1>("Message", 1, 0, "Msg");

예시에서는 main문에 직접 추가해주고 있습니다,

하지만, 프로젝트의 규모가 커지고 커스텀 플러그인이 늘어남에 따라 qmlRegisterType을 매번 따로 추가해야만 QML엔진에 등록이 된다는 것은 매우 번거로워 보입니다.

자동적으로 이를 처리하는 방법은 없을까요?

답변 1

답변을 작성해보세요.

1

안녕하세요. Inhwan Kwon 님

qmlRegisterType 를 사용해 새로운 QML 타입을 만드는 이유로 QML 에서 제공하지 않는 타입을 만드는 경우가 있거든요.

Qt Widget 을 이용해 UI를 개발하는 경우 Qt에서 제공하는 UI가 없을 경우 QWidget 의 PainterEvent 버추얼 함수를 이용해 새로운 사용자 정의 UI를 만드는 것 처럼, QML 에서 qmlRegisterType 를 이용해 클래스를 만들고 이 클래스를 QQuickPaintedItem 을 상속해 만들면 QWidget 의 PainteEvent 버추얼 함수 처럼 QQuickPaintedItem 에서 제공하는 paint 함수를 이용해 QML 에서 사용자 정의 UI를 만들 수 있습니다.

이때 qmlRegisterType 을 이용해 사용자 정의 QML 타입을 만들 수 있습니다.

 

그리고 두 번째로 C++ 영역인 Function Logic 에서 Design Logic 인 QML과 데이터 교환을 있을 경우 매번 qmlRegisterType 을 사용해야 가능합니다.

님께서 지적하신대로 프로젝트 규모에 따라서 qmlRegisterType에 등록해야 하는 클래스가 많아 질 수 있습니다. 그래서 하나의 대안으로 qmlRegisterType을 쓰되 qmlRegisterType 에 등록한 클래스를 C++의 Singleton 을 이용해 대표클래스를 등록해 사용한다면 qmlRegisterType 을 사용해야 하는 빈도 수 를 다소 줄일 수 있지 않을까 싶습니다. 예를 들어 아래 트리와 같이 말이죠.

A Class --------------------- B, C, D, E 클래스

즉 위의 구조 처럼 대표하는 A class 에서 B 클래스, C클래스, D 클래스, E 클래스를 static 으로 인스턴스를 연결하고 A Class 를 qmlRegisterType 을 등록해 사용하면, qmlRegisterType 을 사용해 등록하는 빈도수를 줄일 수 있을 것 같습니다.

이런 방법은 어떨까요?

매우 번거롭겠지만 저는 자동으로 생성할 수 있는 방법은 따로 얿을거 같아요. 만약 꼭 자동으로 사용해야 한다면 MACRO 를 사용해 쓰는 방법이 있지 않을까 싶습니다. ㅡ.ㅡ; (이 방법은 비추)

저 같은 경우 제법 규모있는 프로젝트를 수행한 경험이 있는데 그때도 위와 같이 Singleton 을 이용해 만드는 방법을 추천드립니다.

만약 A class 의 멤버 함수가 만아진다면 여러개의 클래스로 쪼개는 것도 방법이 될 수 있을 것 같습니다. 저도 혹시 다른 방법이 있는지 고민해보고 앞으로 자동으로 할 수 있는 방법을 찾는다면 님께도 알려드리겠습니다.

 

밤에 두서없이 이것 저것 적었네요. 끝까지 읽어주셔서 감사하고 혹시 더 궁금한게 있으면 언제든 질문해주세요.

감사합니다. 김대진 드림.