-
카테고리
-
세부 분야
데스크톱 앱 개발
-
해결 여부
해결됨
qmlRegisterType을 매번 수동으로 입력해줘야 할까요?
23.06.11 23:13 작성 조회수 361
1
//새로운 QML타입을 구현하고, 이를 QML엔진에 등록
qmlRegisterType<Message, 1>("Message", 1, 0, "Msg");
예시에서는 main문에 직접 추가해주고 있습니다,
하지만, 프로젝트의 규모가 커지고 커스텀 플러그인이 늘어남에 따라 qmlRegisterType을 매번 따로 추가해야만 QML엔진에 등록이 된다는 것은 매우 번거로워 보입니다.
자동적으로 이를 처리하는 방법은 없을까요?
답변을 작성해보세요.
1
김대진
지식공유자2023.06.12
안녕하세요. 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 의 멤버 함수가 만아진다면 여러개의 클래스로 쪼개는 것도 방법이 될 수 있을 것 같습니다. 저도 혹시 다른 방법이 있는지 고민해보고 앞으로 자동으로 할 수 있는 방법을 찾는다면 님께도 알려드리겠습니다.
밤에 두서없이 이것 저것 적었네요. 끝까지 읽어주셔서 감사하고 혹시 더 궁금한게 있으면 언제든 질문해주세요.
감사합니다. 김대진 드림.
답변 1