QTP0004
QML 모듈에 QML 파일이 있는 추가 디렉터리에는 추가 qmldir 파일이 필요합니다.
이 정책은 Qt 6.8에 도입되었습니다. 이 정책은 빌드 시스템에서 QML 모듈의 QML 파일이 포함된 각 추가 디렉터리에 대해 추가 qmldir 파일을 생성하도록 합니다.
이 정책을 활성화하면 모듈에 있는 각 QML 컴포넌트의 암시적 임포트가 모듈 자체와 동일하게 이루어집니다. 즉, 모듈을 명시적으로 가져오지 않고도 모든 컴포넌트가 서로를 볼 수 있습니다.
이 정책의 OLD 동작은 모듈의 루트 디렉터리에 대해서만 qmldir 파일이 생성된다는 것입니다.
이 정책의 NEW 동작은 모듈의 QML 파일이 있는 각 디렉터리에 대해 별도의 qmldir 파일을 생성하는 것입니다. 생성된 각 qmldir에는 모듈의 표준 리소스 위치로 암시적 가져오기를 리디렉션하는 prefer 지시어가 포함되어 있습니다.
배경
QML 엔진은 항상 QML 파일이 있는 디렉터리에 대한 암시적 가져오기를 수행합니다. 모듈 루트 디렉터리에 있는 파일의 경우 이 암시적 가져오기는 모듈 자체로 해결되므로 모든 형제 컴포넌트가 표시됩니다. 그러나 QML 파일이 하위 디렉터리에 있는 경우 암시적 가져오기는 대신 해당 하위 디렉터리로 확인됩니다. 그러면 하위 디렉터리에 있는 컴포넌트는 명시적인 import 문을 추가하지 않으면 같은 모듈의 다른 컴포넌트를 볼 수 없습니다. 이는 빈번하게 발생하는 오류의 원인입니다.
NEW 동작을 사용하면 빌드 시스템은 모듈의 정식 리소스 위치를 가리키는 prefer 지시문이 포함된 qmldir 파일을 각 하위 디렉터리에 생성합니다. 이렇게 하면 모듈의 모든 QML 파일을 암시적으로 가져오는 것이 모듈 자체를 가져오는 것과 동일하므로 모든 컴포넌트가 디렉터리에 관계없이 서로를 찾을 수 있습니다.
예시
QML 파일이 여러 하위 디렉터리에 나뉘어 있는 모듈을 생각해 봅시다:
qt_add_qml_module(mymodule
URI MyModule
QML_FILES
Main.qml
controls/MyButton.qml
views/MyView.qml
)views/MyView.qml 에서 controls 하위 디렉터리에서 MyButton 을 사용해야 하는 경우가 흔히 있습니다. OLD 동작을 사용하면 views/MyView.qml 은 views 하위 디렉터리를 암시적으로 가져오기 때문에 import MyModule 을 명시적으로 추가하지 않으면 MyButton 을 찾을 수 없습니다.
NEW 동작을 사용하면 controls 및 views 하위 디렉터리 모두에 추가 qmldir이 생성됩니다. 각각은 암시적 가져오기를 모듈의 정식 리소스 위치로 리디렉션하므로 views/MyView.qml 은 명시적 가져오기 없이도 MyButton 및 모듈의 다른 유형을 사용할 수 있습니다.
qt_add_qml_module() 을 호출하기 전에 프로젝트에서 명시적으로 정책을 설정할 수 있습니다:
qt_policy(SET QTP0004 NEW)
또는 REQUIRES 버전 6.8 이상에서 qt_standard_project_setup()을 호출하세요.
명시적으로 정책을 설정하지 않으면 Qt 6.8에서 경고를 표시합니다.
참고: 정책의 OLD 동작은 더 이상 사용되지 않으며 향후 제거될 수 있습니다.
qt_policy, qt_standard_project_setup(), qt_cmake_policies 및 qt_add_qml_module도참조하십시오 .
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.