QQmlEngine Class
QQmlEngine 클래스는 QML 컴포넌트를 인스턴스화하기 위한 환경을 제공합니다. 더 보기...
Header: | #include <QQmlEngine> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Qml) target_link_libraries(mytarget PRIVATE Qt6::Qml) |
qmake: | QT += qml |
상속합니다: | QJSEngine |
상속 대상: |
속성
- offlineStoragePath : QString
공용 기능
QQmlEngine(QObject *parent = nullptr) | |
virtual | ~QQmlEngine() override |
void | addImageProvider(const QString &providerId, QQmlImageProviderBase *provider) |
void | addImportPath(const QString &path) |
void | addPluginPath(const QString &path) |
void | addUrlInterceptor(QQmlAbstractUrlInterceptor *urlInterceptor) |
QUrl | baseUrl() const |
void | clearComponentCache() |
void | clearSingletons() |
QQmlImageProviderBase * | imageProvider(const QString &providerId) const |
QStringList | importPathList() const |
QQmlIncubationController * | incubationController() const |
QUrl | interceptUrl(const QUrl &url, QQmlAbstractUrlInterceptor::DataType type) const |
(since 6.6) void | markCurrentFunctionAsTranslationBinding() |
QNetworkAccessManager * | networkAccessManager() const |
QQmlNetworkAccessManagerFactory * | networkAccessManagerFactory() const |
QString | offlineStorageDatabaseFilePath(const QString &databaseName) const |
QString | offlineStoragePath() const |
bool | outputWarningsToStandardError() const |
QStringList | pluginPathList() const |
void | removeImageProvider(const QString &providerId) |
void | removeUrlInterceptor(QQmlAbstractUrlInterceptor *urlInterceptor) |
QQmlContext * | rootContext() const |
void | setBaseUrl(const QUrl &url) |
void | setImportPathList(const QStringList &paths) |
void | setIncubationController(QQmlIncubationController *controller) |
void | setNetworkAccessManagerFactory(QQmlNetworkAccessManagerFactory *factory) |
void | setOfflineStoragePath(const QString &dir) |
void | setOutputWarningsToStandardError(bool enabled) |
void | setPluginPathList(const QStringList &paths) |
T | singletonInstance(int qmlTypeId) |
(since 6.5) T | singletonInstance(QAnyStringView uri, QAnyStringView typeName) |
void | trimComponentCache() |
QList<QQmlAbstractUrlInterceptor *> | urlInterceptors() const |
공용 슬롯
void | retranslate() |
신호
void | exit(int retCode) |
(since 6.5) void | offlineStoragePathChanged() |
void | quit() |
void | warnings(const QList<QQmlError> &warnings) |
정적 공용 멤버
QQmlContext * | contextForObject(const QObject *object) |
void | setContextForObject(QObject *object, QQmlContext *context) |
재구현된 보호 함수
virtual bool | event(QEvent *e) override |
관련 비회원
enum | QQmlModuleImportSpecialVersions { QQmlModuleImportModuleAny, QQmlModuleImportLatest, QQmlModuleImportAuto } |
QObject * | qmlAttachedPropertiesObject(const QObject *attachee, bool create = true) |
void | qmlClearTypeRegistrations() |
QQmlContext * | qmlContext(const QObject *object) |
QQmlEngine * | qmlEngine(const QObject *object) |
bool | qmlProtectModule(const char *uri, int majVersion) |
int | qmlRegisterAnonymousType(const char *uri, int versionMajor) |
int | qmlRegisterExtendedType(const char *uri, int versionMajor, int versionMinor, const char *qmlName) |
int | qmlRegisterExtendedUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason) |
void | qmlRegisterModule(const char *uri, int versionMajor, int versionMinor) |
void | qmlRegisterModuleImport(const char *uri, int moduleMajor, const char *import, int importMajor = QQmlModuleImportLatest, int importMinor = QQmlModuleImportLatest) |
int | qmlRegisterRevision(const char *uri, int versionMajor, int versionMinor) |
int | qmlRegisterSingletonInstance(const char *uri, int versionMajor, int versionMinor, const char *typeName, QObject *cppObject) |
int | qmlRegisterSingletonType(const QUrl &url, const char *uri, int versionMajor, int versionMinor, const char *qmlName) |
int | qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, std::function<QJSValue (QQmlEngine *, QJSEngine *)> callback) |
int | qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, std::function<QObject *(QQmlEngine *, QJSEngine *)> callback) |
int | qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName) |
int | qmlRegisterType(const QUrl &url, const char *uri, int versionMajor, int versionMinor, const char *qmlName) |
int | qmlRegisterTypeNotAvailable(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &message) |
int | qmlRegisterUncreatableMetaObject(const QMetaObject &staticMetaObject, const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason) |
int | qmlRegisterUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &message) |
int | qmlTypeId(const char *uri, int versionMajor, int versionMinor, const char *qmlName) |
void | qmlUnregisterModuleImport(const char *uri, int moduleMajor, const char *import, int importMajor = QQmlModuleImportLatest, int importMinor = QQmlModuleImportLatest) |
매크로
QML_ADDED_IN_VERSION(MAJOR, MINOR) | |
QML_ANONYMOUS | |
QML_ATTACHED(ATTACHED_TYPE) | |
(since 6.5) | QML_CONSTRUCTIBLE_VALUE |
QML_DECLARE_TYPE | |
QML_DECLARE_TYPEINFO(Type, Flags) | |
QML_ELEMENT | |
QML_EXTENDED(EXTENDED_TYPE) | |
QML_EXTENDED_NAMESPACE(EXTENDED_NAMESPACE) | |
QML_EXTRA_VERSION(MAJOR, MINOR) | |
QML_FOREIGN(FOREIGN_TYPE) | |
QML_FOREIGN_NAMESPACE(FOREIGN_NAMESPACE) | |
QML_IMPLEMENTS_INTERFACES(interfaces) | |
QML_INTERFACE | |
QML_NAMED_ELEMENT(name) | |
QML_REMOVED_IN_VERSION(MAJOR, MINOR) | |
QML_SEQUENTIAL_CONTAINER(VALUE_TYPE) | |
QML_SINGLETON | |
(since 6.5) | QML_STRUCTURED_VALUE |
QML_UNAVAILABLE | |
QML_UNCREATABLE(reason) | |
QML_VALUE_TYPE(name) |
상세 설명
QQmlEngine은 components 및 그로부터 생성된 객체를 관리하고 바인딩 및 함수를 실행하는 데 사용됩니다. 또한 QQmlEngine은 QJSEngine 에서 상속되어 QML 컴포넌트와 JavaScript 코드 간의 원활한 통합을 가능하게 합니다.
각 QML 컴포넌트는 QQmlContext 에서 인스턴스화됩니다. QML에서 컨텍스트는 계층적으로 배열되며 이 계층 구조는 QQmlEngine에 의해 관리됩니다. 기본적으로 컴포넌트는 root context 에 인스턴스화됩니다.
QQmlComponent, QQmlContext, QML 글로벌 객체 및 QQmlApplicationEngine 를참조하십시오 .
속성 문서
offlineStoragePath : QString
이 속성은 오프라인 사용자 데이터를 저장하는 디렉터리를 보유합니다.
SQL 및 기타 오프라인 저장소가 있는 디렉터리를 반환합니다.
openDatabaseSync()
로 생성된 SQL 데이터베이스는 여기에 저장됩니다.
기본값은 플랫폼 표준 사용자 애플리케이션 데이터 디렉터리의 QML/OfflineStorage입니다.
이 경로가 현재 파일 시스템에 존재하지 않을 수 있으므로 이 위치에 새 파일을 만들려는 호출자는 먼저 QDir::mkpath()를 참조하세요.
액세스 기능:
QString | offlineStoragePath() const |
void | setOfflineStoragePath(const QString &dir) |
알림 신호:
void | offlineStoragePathChanged() |
멤버 함수 문서
[explicit]
QQmlEngine::QQmlEngine(QObject *parent = nullptr)
주어진 parent 을 사용하여 새 QQmlEngine을 생성합니다.
[override virtual noexcept]
QQmlEngine::~QQmlEngine()
QQmlEngine 을 파괴합니다.
이 엔진에서 생성된 모든 QQmlContext 은 무효화되지만 파괴되지는 않습니다( QQmlEngine 객체에 부모가 없는 경우).
JS 엔진 정리에 대한 자세한 내용은QJSEngine()를 참조하세요.
void QQmlEngine::addImageProvider(const QString &providerId, QQmlImageProviderBase *provider)
이미지: url 스키마를 통해 요청된 이미지에 사용할 provider 을 설정하고 호스트는 providerId 입니다. QQmlEngine 은 provider 의 소유권을 갖습니다.
이미지 공급자는 픽셀맵 및 스레드 이미지 요청을 지원할 수 있습니다. 이미지 제공업체 구현 및 사용에 대한 자세한 내용은 QQuickImageProvider 문서를 참조하세요.
모든 필수 이미지 공급자는 QML 소스 파일을 로드하기 전에 엔진에 추가해야 합니다.
removeImageProvider(), QQuickImageProvider, 및 QQmlImageProviderBase 를참조하세요 .
void QQmlEngine::addImportPath(const QString &path)
엔진이 URL 기반 디렉토리 구조에서 설치된 모듈을 검색하는 디렉터리로 path 을 추가합니다.
path 은 로컬 파일 시스템 디렉터리, Qt 리소스 경로(:/imports
), Qt 리소스 URL(qrc:/imports
) 또는 URL일 수 있습니다.
path 은 가져오기 경로 목록에 추가되기 전에 표준 형식으로 변환됩니다.
새로 추가된 path 은 importPathList()의 첫 번째가 됩니다.
setImportPathList(), QML 모듈 및 QML 가져오기 경로도참조하십시오.
void QQmlEngine::addPluginPath(const QString &path)
엔진이 가져온 모듈( qmldir
파일에서 참조)에 대한 네이티브 플러그인을 검색하는 디렉터리로 path 을 추가합니다.
기본적으로 목록에는 .
, 즉 엔진이 qmldir
파일 자체의 디렉터리에서 검색하는 디렉터리만 포함됩니다.
새로 추가된 path 은 pluginPathList()에서 가장 먼저 검색됩니다.
setPluginPathList()도 참조하세요 .
void QQmlEngine::addUrlInterceptor(QQmlAbstractUrlInterceptor *urlInterceptor)
QML에서 URL을 확인할 때 사용할 urlInterceptor 을 추가합니다. 이는 스크립트 파일 및 QML 유형을 로드하는 데 사용되는 URL에도 적용됩니다. 엔진이 파일을 로드하는 동안 URL 인터셉터를 수정해서는 안 되며, 그렇지 않으면 URL 선택이 일관되지 않을 수 있습니다. 여러 URL 인터셉터가 주어진 경우 각 URL에 대해 추가된 순서대로 호출됩니다.
QQmlEngine 인터셉터에 대한 소유권을 가져가지 않으며 삭제하지 않습니다.
QUrl QQmlEngine::baseUrl() const
이 엔진의 기본 URL을 반환합니다. 기본 URL은 QQmlComponent 생성자에 상대 URL이 전달될 때만 컴포넌트를 확인하는 데 사용됩니다.
기본 URL이 명시적으로 설정되지 않은 경우 이 메서드는 애플리케이션의 현재 작업 디렉터리를 반환합니다.
setBaseUrl()도 참조하세요 .
void QQmlEngine::clearComponentCache()
엔진의 내부 컴포넌트 캐시를 지웁니다.
이 함수는 엔진이 이전에 로드한 대부분의 컴포넌트의 프로퍼티 메타데이터를 삭제합니다. 엔진의 컴포넌트 캐시에서 참조되지 않은 컴포넌트를 삭제하는 방식으로 이루어집니다. 아직 참조 중인 컴포넌트는 삭제하지 않는데, 이는 나중에 크래시가 발생할 가능성이 높기 때문입니다.
참조된 컴포넌트가 없는 경우 이 함수는 엔진을 로드된 컴포넌트 데이터가 없는 상태로 반환합니다. 이는 이전 컴포넌트 세트의 작은 하위 집합을 다시 로드하거나 이전에 로드된 컴포넌트의 새 버전을 로드할 때 유용할 수 있습니다.
컴포넌트 캐시가 지워지면 새 객체를 생성하기 전에 컴포넌트를 로드해야 합니다.
참고: 컴포넌트 캐시를 지워도 QML 컴포넌트에서 생성된 기존 객체는 해당 유형을 유지합니다. 여기에는 싱글톤 객체가 포함됩니다. 캐시를 지운 후 동일한 QML 코드에서 더 많은 객체를 만들면 새 객체는 이전 객체와 다른 유형이 됩니다. 이러한 새 객체를 캐시를 지우기 전에 생성된 객체에 속하는 선언된 유형의 프로퍼티에 할당하면 작동하지 않습니다.
일반적으로 컴포넌트 캐시를 지울 때 QML 컴포넌트에서 생성된 객체가 남아 있지 않은지 확인하세요.
trimComponentCache() 및 clearSingletons()도 참조하세요 .
void QQmlEngine::clearSingletons()
엔진이 소유한 모든 싱글톤을 지웁니다.
이 함수는 모든 싱글톤 인스턴스를 삭제하여 그 중 엔진이 소유한 모든 QObject를 삭제합니다. 이 함수는 clearComponentCache()를 호출하기 전에 QML로 생성된 객체가 남지 않도록 하는 데 유용합니다.
QObject-기반 싱글톤 인스턴스를 보유한 QML 프로퍼티는 엔진이 싱글톤을 소유한 경우 null이 되고, 엔진이 소유하지 않은 경우 값을 유지합니다. 싱글톤은 기존 QML로 생성된 객체에 액세스하여 자동으로 다시 생성되지 않습니다. 새 컴포넌트가 인스턴스화될 때만 싱글톤이 다시 생성됩니다.
clearComponentCache()도 참조하세요 .
[static]
QQmlContext *QQmlEngine::contextForObject(const QObject *object)
object 에 대해 QQmlContext 을 반환하거나 컨텍스트가 설정되지 않은 경우 nullptr을 반환합니다.
QQmlEngine 이 QObject 을 인스턴스화하면 내부 컨텍스트가 자동으로 할당됩니다. 이러한 내부 컨텍스트는 읽기 전용입니다. 컨텍스트 속성을 설정할 수 없습니다.
setContextForObject(), qmlContext(), qmlEngine() 및 QQmlContext::setContextProperty()도 참조하세요 .
[override virtual protected]
bool QQmlEngine::event(QEvent *e)
다시 구현합니다: QObject::event(QEvent *e).
[signal]
void QQmlEngine::exit(int retCode)
이 신호는 엔진에서 로드한 QML이 지정된 반환 코드를 사용하여 이벤트 루프에서 종료하고자 할 때 발생합니다 retCode.
quit()도 참조하세요 .
QQmlImageProviderBase *QQmlEngine::imageProvider(const QString &providerId) const
providerId 에 설정된 이미지 공급자를 찾으면 반환하고, 그렇지 않으면 nullptr
을 반환합니다.
QQuickImageProvider 를참조하세요 .
QStringList QQmlEngine::importPathList() const
엔진이 URL 기반 디렉토리 구조에서 설치된 모듈을 검색하는 디렉터리 목록을 반환합니다.
예를 들어 경로에 /opt/MyApp/lib/imports
이 있으면 com.mycompany.Feature
을 임포트하는 QML은 QQmlEngine 에서 해당 모듈이 제공하는 컴포넌트를 /opt/MyApp/lib/imports/com/mycompany/Feature/
에서 찾게 됩니다. qmldir
파일은 유형 버전 매핑 및 QML 확장 플러그인을 정의하는 데 필요합니다.
기본적으로 이 목록에는 QML 가져오기 경로에 언급된 경로가 포함됩니다.
addImportPath() 및 setImportPathList()도 참조하세요 .
QQmlIncubationController *QQmlEngine::incubationController() const
현재 설정된 인큐베이션 컨트롤러를 반환하거나 컨트롤러가 설정되지 않은 경우 0을 반환합니다.
setIncubationController()도 참조하세요 .
QUrl QQmlEngine::interceptUrl(const QUrl &url, QQmlAbstractUrlInterceptor::DataType type) const
주어진 type 의 주어진 url 에서 현재 URL 인터셉터를 실행하고 결과를 반환합니다.
[since 6.6]
void QQmlEngine::markCurrentFunctionAsTranslationBinding()
이 메서드가 QML에서 바인딩의 일부인 함수 내부에서 호출되면 바인딩은 번역 바인딩으로 처리됩니다.
class I18nAwareClass : public QObject { //... QString text() const { if (auto engine = qmlEngine(this)) engine->markCurrentFunctionAsTranslationBinding(); return tr("Hello, world!"); } };
참고: 이 함수는 qsTr 함수에 대한 자체 대안을 제공하려는 경우에 주로 유용합니다. 언어 변경 시 C++ 클래스에서 노출된 프로퍼티가 업데이트되도록 하려면 LanguageChange
이벤트에 반응하는 것이 좋습니다. 이는 클래스가 QML이 아닌 컨텍스트에서 사용되는 경우에도 작동하는 보다 일반적인 메커니즘이며 오버헤드가 약간 적습니다. 그러나 클래스가 이미 QML 엔진에 밀접하게 연결되어 있는 경우에는 markCurrentFunctionAsTranslationBinding
을 사용하는 것도 허용될 수 있습니다. 자세한 내용은 동적 언어 변경에 대비하기를 참조하십시오.
이 함수는 Qt 6.6에 도입되었습니다.
QQmlEngine::retranslate 를참조하십시오 .
QNetworkAccessManager *QQmlEngine::networkAccessManager() const
이 엔진에 의해 인스턴스화된 모든 QML 유형에서 사용할 수 있는 일반적인 QNetworkAccessManager 을 반환합니다.
QQmlNetworkAccessManagerFactory 가 설정되어 있고 QNetworkAccessManager 가 아직 생성되지 않은 경우 QQmlNetworkAccessManagerFactory 를 사용하여 QNetworkAccessManager 를 생성하고, 그렇지 않으면 반환된 QNetworkAccessManager 에는 프록시나 캐시가 설정되어 있지 않습니다.
setNetworkAccessManagerFactory()도 참조하세요 .
QQmlNetworkAccessManagerFactory *QQmlEngine::networkAccessManagerFactory() const
현재 QQmlNetworkAccessManagerFactory 를 반환합니다.
setNetworkAccessManagerFactory()도 참조하세요 .
QString QQmlEngine::offlineStorageDatabaseFilePath(const QString &databaseName) const
식별자가 databaseName 인 Local Storage 데이터베이스가 있는(또는 있을) 파일 경로를 반환합니다.
LocalStorage.openDatabaseSync()도 참조하세요 .
[signal, since 6.5]
void QQmlEngine::offlineStoragePathChanged()
이 신호는 offlineStoragePath 변경 시 발신됩니다.
참고: 속성 offlineStoragePath 에 대한 알림 신호.
이 함수는 Qt 6.5에 도입되었습니다.
bool QQmlEngine::outputWarningsToStandardError() const
warnings() 신호에 의해 출력되는 것 외에 경고 메시지가 stderr에 출력되면 참을 반환하고, 그렇지 않으면 거짓을 반환합니다.
기본값은 참입니다.
setOutputWarningsToStandardError()도 참조하세요 .
QStringList QQmlEngine::pluginPathList() const
엔진이 가져온 모듈의 네이티브 플러그인을 검색하는 디렉터리 목록을 반환합니다( qmldir
파일에서 참조).
기본적으로 이 목록에는 .
, 즉 엔진이 qmldir
파일 자체의 디렉터리에서 검색하는 디렉터리만 포함됩니다.
addPluginPath() 및 setPluginPathList()도 참조하세요 .
[signal]
void QQmlEngine::quit()
이 신호는 엔진에 로드된 QML이 종료하고자 할 때 발생합니다.
exit()도 참조하세요 .
void QQmlEngine::removeImageProvider(const QString &providerId)
providerId 에 대한 이미지 공급자를 제거합니다.
addImageProvider() 및 QQuickImageProvider도 참조하세요 .
void QQmlEngine::removeUrlInterceptor(QQmlAbstractUrlInterceptor *urlInterceptor)
addUrlInterceptor 을 사용하여 이전에 추가한 urlInterceptor 을 제거합니다. 엔진이 파일을 로드하는 동안 URL 인터셉터를 수정해서는 안 되며, 그렇지 않으면 URL 선택이 일관되지 않을 수 있습니다.
이렇게 하면 인터셉터가 삭제되는 것이 아니라 엔진에서 제거될 뿐입니다. 나중에 같은 엔진이나 다른 엔진에서 다시 사용할 수 있습니다.
[slot]
void QQmlEngine::retranslate()
번역용으로 표시된 문자열을 사용하는 모든 바인딩 표현식을 새로 고칩니다.
QCoreApplication::installTranslator 을 사용하여 새 번역기를 설치한 후 이 함수를 호출하면 사용자 인터페이스에 최신 번역이 표시되도록 할 수 있습니다.
QQmlContext *QQmlEngine::rootContext() const
엔진의 루트 컨텍스트를 반환합니다.
루트 컨텍스트는 QQmlEngine 에 의해 자동으로 생성됩니다. 엔진에 의해 인스턴스화된 모든 QML 컴포넌트 인스턴스에서 사용할 수 있어야 하는 데이터는 루트 컨텍스트에 넣어야 합니다.
컴포넌트 인스턴스의 하위 집합에서만 사용할 수 있어야 하는 추가 데이터는 루트 컨텍스트에 부모를 둔 하위 컨텍스트에 추가해야 합니다.
void QQmlEngine::setBaseUrl(const QUrl &url)
이 엔진의 기본 URL을 url 으로 설정합니다.
baseUrl()도 참조하세요 .
[static]
void QQmlEngine::setContextForObject(QObject *object, QQmlContext *context)
object 에 대한 QQmlContext 을 context 로 설정합니다. object 에 이미 컨텍스트가 있는 경우 경고가 출력되지만 컨텍스트는 변경되지 않습니다.
QQmlEngine 가 QObject 을 인스턴스화하면 컨텍스트가 자동으로 설정됩니다.
contextForObject()도 참조하세요 .
void QQmlEngine::setImportPathList(const QStringList &paths)
엔진이 URL 기반 디렉토리 구조에서 설치된 모듈을 검색할 디렉터리 목록으로 paths 을 설정합니다.
기본적으로 이 목록에는 QML 가져오기 경로에 언급된 경로가 포함됩니다.
경고: setImportPathList를 호출해도 기본 가져오기 경로는 유지되지 않습니다.
importPathList() 및 addImportPath()도 참조하세요 .
void QQmlEngine::setIncubationController(QQmlIncubationController *controller)
엔진의 인큐베이션을 설정합니다 controller. 엔진은 활성 컨트롤러를 하나만 가질 수 있으며 소유권을 가지지 않습니다.
incubationController()도 참조하세요 .
void QQmlEngine::setNetworkAccessManagerFactory(QQmlNetworkAccessManagerFactory *factory)
QNetworkAccessManager(들)을 만드는 데 사용할 factory 을 설정합니다.
QNetworkAccessManager 는 QML의 모든 네트워크 액세스에 사용됩니다. 팩토리를 구현하면 특수 캐싱, 프록시 및 쿠키를 지원하는 사용자 지정 QNetworkAccessManager 을 생성할 수 있습니다.
엔진을 실행하기 전에 팩토리를 설정해야 합니다.
참고: QQmlEngine 은 팩토리의 소유권을 갖지 않습니다.
networkAccessManagerFactory()도 참조하세요 .
void QQmlEngine::setOutputWarningsToStandardError(bool enabled)
경고 메시지를 enabled 으로 출력할지 여부를 설정합니다.
enabled 이 참이면 QML에서 생성된 모든 경고 메시지가 stderr로 출력되고 warnings() 신호로 전송됩니다. enabled 이 거짓이면 warnings() 신호만 방출됩니다. 이를 통해 애플리케이션이 경고 출력을 직접 처리할 수 있습니다.
기본값은 참입니다.
outputWarningsToStandardError()도 참조하세요 .
void QQmlEngine::setPluginPathList(const QStringList &paths)
엔진이 가져온 모듈( qmldir
파일에서 참조)에 대한 네이티브 플러그인을 검색하는 디렉터리 목록을 paths 으로 설정합니다.
기본적으로 목록에는 .
, 즉 엔진이 qmldir
파일 자체의 디렉터리에서 검색하는 디렉터리만 포함됩니다.
pluginPathList() 및 addPluginPath()도 참조하세요 .
template <typename T> T QQmlEngine::singletonInstance(int qmlTypeId)
qmlTypeId 에 등록된 싱글톤 타입의 인스턴스를 반환합니다.
템플릿 인자 T는 QJSValue 또는 QObject 파생 유형에 대한 포인터일 수 있으며 싱글톤이 어떻게 등록되었는지에 따라 달라집니다. T의 인스턴스가 아직 생성되지 않은 경우 지금 생성됩니다. qmlTypeId 이 유효한 싱글톤 유형을 나타내지 않으면 기본으로 구성된 QJSValue 또는 nullptr
이 반환됩니다.
QObject* 예시:
class MySingleton : public QObject { Q_OBJECT // Register as default constructed singleton. QML_ELEMENT QML_SINGLETON static int typeId; // ... }; MySingleton::typeId = qmlTypeId(...); // Retrieve as QObject* QQmlEngine engine; MySingleton* instance = engine.singletonInstance<MySingleton*>(MySingleton::typeId);
QJSValue 예시:
// Register with QJSValue callback int typeId = qmlRegisterSingletonType(...); // Retrieve as QJSValue QQmlEngine engine; QJSValue instance = engine.singletonInstance<QJSValue>(typeId);
예를 들어 싱글톤 클래스의 정적 멤버로 QML 유형 ID를 저장하는 것이 좋습니다. qmlTypeId ()를 통한 조회는 비용이 많이 듭니다.
QML_SINGLETON, qmlRegisterSingletonType() 및 qmlTypeId()도 참조하세요 .
[since 6.5]
template <typename T> T QQmlEngine::singletonInstance(QAnyStringView uri, QAnyStringView typeName)
이 함수는 오버로드된 함수입니다.
uri 에 지정된 모듈에서 typeName 라는 싱글톤 유형의 인스턴스를 반환합니다.
이 메서드는 qmlTypeId 를 호출한 후 singletonInstance의 ID 기반 오버로드를 호출하는 대신 사용할 수 있습니다. 이는 싱글톤을 한 번만 설정해야 할 때 편리하며, 싱글톤에 반복적으로 액세스해야 하는 경우 typeId를 캐싱하면 type-id based overload 을 통해 더 빠르게 후속 액세스를 수행할 수 있습니다.
템플릿 인자 T는 QJSValue 또는 QObject 파생 유형에 대한 포인터일 수 있으며, 싱글톤이 어떻게 등록되었는지에 따라 달라집니다. T의 인스턴스가 아직 생성되지 않은 경우 지금 생성됩니다. typeName 이 유효한 싱글톤 유형을 나타내지 않으면, 기본으로 구성된 QJSValue 또는 nullptr
이 반환됩니다.
QQmlEngine engine; MySingleton *singleton = engine.singletonInstance<MySingleton *>("mymodule", "MySingleton"); /
이 함수는 Qt 6.5에 도입되었습니다.
QML_SINGLETON, qmlRegisterSingletonType() 및 qmlTypeId()도 참조하십시오 .
void QQmlEngine::trimComponentCache()
엔진의 내부 컴포넌트 캐시를 트림합니다.
이 함수는 현재 사용 중이 아닌 로드된 컴포넌트의 프로퍼티 메타데이터를 소멸시킵니다.
컴포넌트 자체의 인스턴스, 해당 컴포넌트를 사용하는 다른 컴포넌트의 인스턴스 또는 해당 컴포넌트에 의해 인스턴스화된 오브젝트가 있는 경우 컴포넌트는 사용 중인 것으로 간주됩니다.
clearComponentCache()도 참조하세요 .
QList<QQmlAbstractUrlInterceptor *> QQmlEngine::urlInterceptors() const
현재 활성화된 URL 인터셉터 목록을 반환합니다.
[signal]
void QQmlEngine::warnings(const QList<QQmlError> &warnings)
이 신호는 QML에서 warnings 메시지가 생성될 때 방출됩니다.
관련 비회원
enum QQmlModuleImportSpecialVersions
qmlRegisterModuleImport() 및 qmlUnregisterModuleImport()의 버전 인수에 전달할 수 있는 몇 가지 특수 값을 정의합니다.
Constant | 값 | 설명 |
---|---|---|
QQmlEngine::QQmlModuleImportModuleAny | -1 | 기본 모듈의 주요 버전으로 전달되면 가져오기가 모듈의 모든 버전에 적용됨을 나타냅니다. |
QQmlEngine::QQmlModuleImportLatest | -1 | 가져온 모듈의 메이저 또는 마이너 버전으로 전달되면 지정된 메이저 버전의 최신 전체 버전 또는 최신 마이너 버전을 가져온다는 의미입니다. |
QQmlEngine::QQmlModuleImportAuto | -2 | 가져온 모듈의 메이저 버전으로 전달되면 기본 모듈의 버전이 전달됨을 나타냅니다. |
template <typename T> QObject *qmlAttachedPropertiesObject(const QObject *attachee, bool create = true)
이 템플릿 함수의 형태는 다음과 같습니다:
template<typename T> QObject *qmlAttachedPropertiesObject(const QObject *attachee, bool create = true)
지정한 attachee 에 첨부 유형 T 로 첨부된 첨부된 객체 인스턴스를 반환합니다.
create 이 참이고 첨부 유형 T가 유효한 첨부 유형이면 새 첨부 개체 인스턴스를 생성하여 반환합니다.
T 유형이 유효한 첨부 유형이 아니거나 create 이 거짓이고 이전에 attachee 에 대해 첨부 개체 인스턴스가 생성되지 않은 경우 nullptr
을 반환합니다.
QML_ATTACHED() 및 첨부 속성 제공도참조하세요 .
void qmlClearTypeRegistrations()
qmlRegisterType()로 생성된 등록과 같이 저장된 모든 유형 등록을 지웁니다.
QQmlEngine 가 존재하는 동안 이 함수를 호출하지 않으면 동작이 정의되지 않습니다. 이 함수를 호출하기 전에 기존 QQmlEngines를 모두 삭제해야 합니다. 이 함수는 애플리케이션 글로벌 캐시에만 영향을 줍니다. QQmlEngine 을 삭제하면 해당 엔진과 관련된 모든 캐시된 데이터가 지워집니다.
QQmlContext *qmlContext(const QObject *object)
object 과 연결된 QQmlContext 을 반환합니다(있는 경우). 이는 QQmlEngine::contextForObject(객체)와 동일합니다.
참고: 이 함수를 사용하려면 #include <QtQml>
을 추가하세요.
contextForObject() 및 qmlEngine()도 참조하세요 .
QQmlEngine *qmlEngine(const QObject *object)
object 과 연관된 QQmlEngine 을 반환합니다(있는 경우). 이는 QQmlEngine::contextForObject(object)->engine()과 동일하지만 더 효율적입니다.
참고: 이 함수를 사용하려면 #include <QtQml>
을 추가하세요.
contextForObject() 및 qmlContext()도 참조하세요 .
bool qmlProtectModule(const char *uri, int majVersion)
이 기능은 모듈이 더 이상 수정되지 않도록 보호합니다. 다른 플러그인이 모듈에 유형을 주입하는 것을 방지하는 데 사용할 수 있습니다. 또한 이 가져오기에 도달했을 때 엔진이 새로운 유형이나 플러그인의 가능성을 검사하는 것을 건너뛸 수 있으므로 성능이 향상될 수도 있습니다.
qmlProtectModule이 호출되면 QML 엔진은 더 이상 모듈을 로드하기 위해 새 qmldir
파일을 검색하지 않습니다. 하지만 이전에 로드한 qmldir
파일을 다시 사용합니다. 따라서 이 시점에 존재하는 유형은 계속 작동합니다. QML 엔진마다 다른 모듈을 로드할 수 있다는 점에 유의하세요. 그러나 모듈 보호는 전역적이며 모든 엔진에 영향을 미칩니다. qmldir
파일을 찾고 플러그인을 로드하는 오버헤드는 느린 파일 시스템에서 눈에 띄게 나타날 수 있습니다. 따라서 모듈을 더 이상 로드할 필요가 없다고 판단되면 모듈을 보호하는 것이 좋은 최적화 방법일 수 있습니다. 모듈 잠금은 플러그인뿐만 아니라 import
또는 prefer
과 같은 다른 qmldir 지시어와 qmldir
파일에 선언된 모든 복합 유형 또는 스크립트에도 영향을 미친다는 점도 기억하세요.
또한 이 함수가 호출된 후 이 uri, 메이저 버전 조합에 C++ 유형을 등록하려고 시도하면 런타임 오류가 발생합니다.
모듈 식별자가 uri, 메이저 버전 번호가 majVersion 인 모듈이 발견되어 잠겨 있으면 참을 반환하고, 그렇지 않으면 거짓을 반환합니다. 모듈을 찾으려면 모듈에 내보낸 유형이 포함되어 있어야 합니다.
template <typename T> int qmlRegisterAnonymousType(const char *uri, int versionMajor)
이 템플릿 함수는 QML 시스템에 C++ 타입을 익명 타입으로 등록합니다. 결과 QML 유형에는 이름이 없습니다. 따라서 이 유형의 인스턴스는 QML 시스템에서 생성할 수 없습니다. 그러나 해당 유형의 인스턴스가 다른 유형의 프로퍼티로 노출된 경우 해당 유형에 액세스할 수 있습니다.
유형이 이름으로 참조되지 않을 때, 특히 속성 바인딩의 왼쪽에 사용되는 C++ 유형의 경우 이 함수를 사용합니다. 유형이 속한 모듈을 표시하려면 uri 및 versionMajor 을 사용합니다.
예를 들어 다음 두 클래스를 생각해 보세요:
class Bar : public QObject { Q_OBJECT Q_PROPERTY(QString baz READ baz WRITE setBaz NOTIFY bazChanged) public: Bar() {} QString baz() const { return mBaz; } void setBaz(const QString &baz) { if (baz == mBaz) return; mBaz = baz; emit bazChanged(); } signals: void bazChanged(); private: QString mBaz; }; class Foo : public QObject { Q_OBJECT Q_PROPERTY(Bar *bar READ bar CONSTANT FINAL) public: Foo() {} Bar *bar() { return &mBar; } private: Bar mBar; };
QML에서는 bar
의 baz
프로퍼티에 문자열을 할당합니다:
Foo { bar.baz: "abc" Component.onCompleted: print(bar.baz) }
QML 엔진이 Bar
유형에 baz
속성이 있다는 것을 알기 위해서는 Bar
을 알려야 합니다:
qmlRegisterType<Foo>("App", 1, 0, "Foo"); qmlRegisterAnonymousType<Bar>("App", 1);
Foo
유형은 QML에서 인스턴스화되므로 요소 이름을 취하는 qmlRegisterType() 버전으로 등록해야 합니다.
QML 유형 ID를 반환합니다.
QML_ANONYMOUS 및 C++와 QML 간의 올바른 통합 방법 선택하기를참조하세요 .
template <typename T, typename E> int qmlRegisterExtendedType(const char *uri, int versionMajor, int versionMinor, const char *qmlName)
이 템플릿 함수는 uri 에서 가져온 라이브러리에 versionMajor 및 versionMinor 에서 구성된 버전 번호를 가진 qmlName 이라는 이름의 C++ 유형과 해당 확장 객체를 QML 시스템에 등록합니다. 기본 유형에서 사용할 수 없는 속성은 확장 객체에서 검색됩니다.
QML 유형 ID를 반환합니다.
QML_EXTENDED(), qmlRegisterType() 및 확장 객체 등록하기를참조하세요 .
template <typename T, typename E> int qmlRegisterExtendedUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason)
이 템플릿 함수는 versionMajor 및 versionMinor 에서 구성된 버전 번호를 가진 uri 에서 가져온 라이브러리에 qmlName 이라는 이름으로 C++ 유형과 해당 확장자를 QML 시스템에 등록합니다.
유형에 이름과 유형이 있지만 생성할 수 없습니다. 사용자가 이 유형의 인스턴스를 만들려고 하면 reason 이라는 오류 메시지가 인쇄됩니다.
이 함수는 유형이 연결된 속성, 열거형 값 또는 확장된 추상 기본 클래스를 제공하기 위한 용도로만 사용되는 경우에 유용합니다.
QML 타입 ID를 반환합니다.
QML_EXTENDED(), QML_UNCREATABLE() 및 qmlRegisterUncreatableType()도 참조하세요 .
void qmlRegisterModule(const char *uri, int versionMajor, int versionMinor)
이 함수는 특정 uri 에 versionMajor 및 versionMinor 에 지정된 버전으로 모듈을 등록합니다.
해당 버전에 등록된 유형이 없더라도 특정 모듈 버전을 사용할 수 있도록 하는 데 사용할 수 있습니다. 이 기능은 관련 모듈의 버전을 동기화할 때 특히 유용합니다.
void qmlRegisterModuleImport(const char *uri, int moduleMajor, const char *import, int importMajor = QQmlModuleImportLatest, int importMinor = QQmlModuleImportLatest)
주 버전 moduleMajor 의 모듈 uri 에 대한 qmldir-import를 등록합니다.
이는 qmldir 파일에서 import
문과 동일한 효과가 있습니다: uri 버전 moduleMajor 을 가져올 때마다 import 버전 importMajor. importMinor 도 자동으로 가져옵니다. importMajor 가 QQmlModuleImportLatest 인 경우 해당 모듈의 사용 가능한 최신 버전이 가져오고 importMinor 는 중요하지 않습니다. importMinor 가 QQmlModuleImportLatest 인 경우 importMajor 의 최신 부 버전이 선택됩니다. importMajor 가 QQmlModuleImportAuto 인 경우 import 의 버전은 가져오는 uri 의 버전이며, importMinor 는 중요하지 않습니다. moduleMajor 가 QQmlModuleImportModuleAny 인 경우 uri 의 모든 메이저 버전에 대해 모듈 가져오기가 적용됩니다. 예를 들어 MyModule의 모든 버전을 가져올 때마다 MyOtherModule의 최신 버전을 가져오도록 지정할 수 있습니다. 그러면 다음과 같은 호출이 적절할 것입니다:
qmlRegisterModuleImport("MyModule", QQmlModuleImportModuleAny, "MyOtherModule", QQmlModuleImportLatest);
또는 "MyModule"의 주요 버전 5를 가져올 때마다 "MyOtherModule"의 버전 3.14를 가져오도록 지정할 수 있습니다:
qmlRegisterModuleImport("MyModule", 5, "MyOtherModule", 3, 14);
마지막으로, "MyModule"을 가져올 때마다 항상 동일한 버전의 "MyOtherModule"을 가져오려면 다음과 같이 지정하세요:
qmlRegisterModuleImport("MyModule", QQmlModuleImportModuleAny, "MyOtherModule", QQmlModuleImportAuto);
qmlUnregisterModuleImport()도 참조하세요 .
template <typename T, int metaObjectRevision> int qmlRegisterRevision(const char *uri, int versionMajor, int versionMinor)
이 템플릿 함수는 uri 에서 가져온 라이브러리의 버전 번호가 versionMajor 및 versionMinor 에서 구성된 C++ 타입의 지정된 리비전을 QML 시스템에 등록합니다.
QML 타입 ID를 반환합니다.
template<typename T, int metaObjectRevision> int qmlRegisterRevision(const char *uri, int versionMajor, int versionMinor);
이 함수는 일반적으로 타입의 지정된 버전에 사용할 베이스 클래스의 리비전을 등록하는 데 사용됩니다( 타입 리비전 및 버전 참조).
int qmlRegisterSingletonInstance(const char *uri, int versionMajor, int versionMinor, const char *typeName, QObject *cppObject)
이 함수는 특정 uri 및 typeName 과 함께 싱글톤 객체 cppObject 를 등록하는 데 사용됩니다. 해당 버전은 versionMajor 및 versionMinor 의 조합입니다.
싱글톤 타입을 URI에 설치하면 클라이언트에서 해당 타입의 개별 인스턴스를 인스턴스화할 필요 없이 QML 코드에 임의의 기능(메서드 및 속성)을 제공할 수 있습니다.
이 함수를 사용하여 주어진 타입 T의 객체를 싱글톤 타입으로 등록할 수 있습니다.
QObject 싱글톤 타입은 등록된 타입 이름을 통해 참조할 수 있으며, 이 타입 이름은 Connections 타입의 대상으로 사용하거나 다른 타입 ID처럼 사용할 수 있습니다. 그러나 한 가지 예외가 있습니다. QObject 싱글톤 유형 속성은 별칭을 붙일 수 없습니다. 싱글톤 유형 이름이 다른 항목과 동일한 컴포넌트 내의 개체를 식별하지 않기 때문입니다.
참고: cppObject 은 사용되는 QML 엔진보다 오래 지속되어야 합니다. 또한 cppObject는 엔진과 동일한 스레드 선호도를 가져야 합니다. 여러 엔진에 대해 별도의 싱글톤 인스턴스를 사용하려면 qmlRegisterSingletonType 을 사용해야 합니다. 스레드 안전성에 대한 자세한 내용은 스레드 및 QObject를 참조하세요.
참고: qmlRegisterSingleton은 해당 모듈의 모든 유형이 절차적으로 등록된 경우에만 사용할 수 있습니다.
사용법:
// First, define your QObject which provides the functionality. class SingletonTypeExample : public QObject { Q_OBJECT Q_PROPERTY(int someProperty READ someProperty WRITE setSomeProperty NOTIFY somePropertyChanged) public: explicit SingletonTypeExample(QObject* parent = nullptr) : QObject(parent) {} Q_INVOKABLE int doSomething() { setSomeProperty(5); return m_someProperty; } int someProperty() const { return m_someProperty; } void setSomeProperty(int val) { if (m_someProperty != val) { m_someProperty = val; emit somePropertyChanged(val); } } signals: void somePropertyChanged(int newValue); private: int m_someProperty = 0; };
// Second, create an instance of the object // allocate example before the engine to ensure that it outlives it QScopedPointer<SingletonTypeExample> example(new SingletonTypeExample); QQmlEngine engine; // Third, register the singleton type provider with QML by calling this // function in an initialization function. qmlRegisterSingletonInstance("Qt.example.qobjectSingleton", 1, 0, "MyApi", example.get());
QML에서 등록된 싱글톤 유형을 사용하려면 해당 버전으로 URI를 가져와야 합니다.
import QtQuick 2.0 import Qt.example.qobjectSingleton 1.0 Item { id: root property int someValue: MyApi.someProperty Component.onCompleted: { console.log(MyApi.doSomething()) } }
QML_SINGLETON 및 qmlRegisterSingletonType 을참조하세요 .
int qmlRegisterSingletonType(const QUrl &url, const char *uri, int versionMajor, int versionMinor, const char *qmlName)
이 함수는 uri 에서 가져온 라이브러리에 versionMajor 및 versionMinor 에서 구성한 버전 번호를 가진 qmlName 이라는 이름의 싱글톤 유형을 등록하는 데 사용할 수 있습니다. 이 유형은 url 에 있는 QML 파일에 의해 정의됩니다. URL은 절대 URL이어야 합니다(예: url.isRelative() == false).
또한 해당 유형의 QML 파일에는 가져오기 문 중 pragma Singleton 문이 있어야 합니다.
싱글톤 타입은 등록된 타입 이름을 통해 참조할 수 있으며, 이 타입 이름은 Connections 타입의 대상으로 사용되거나 다른 타입 ID처럼 사용될 수 있습니다. 한 가지 예외는 싱글톤 타입 속성은 별칭을 붙일 수 없다는 것입니다(싱글톤 타입 이름이 다른 항목과 동일한 컴포넌트 내의 객체를 식별하지 못하기 때문입니다).
사용법:
// First, define your QML singleton type which provides the functionality. pragma Singleton import QtQuick 2.0 Item { property int testProp1: 125 }
// Second, register the QML singleton type by calling this function in an initialization function. qmlRegisterSingletonType(QUrl("file:///absolute/path/SingletonType.qml"), "Qt.example.qobjectSingleton", 1, 0, "RegisteredSingleton");
QML에서 등록된 싱글톤 유형을 사용하려면 해당 싱글톤 유형을 임포트해야 합니다.
import QtQuick 2.0 import Qt.example.qobjectSingleton 1.0 Item { id: root property int someValue: RegisteredSingleton.testProp1 }
qmlRegisterSingletonType 함수를 사용하지 않고도 QML 싱글톤 유형을 등록할 수 있습니다. 이는 해당 유형의 QML 파일 가져오기 중에 pragma Singleton 문을 추가하여 수행할 수 있습니다. 또한 유형은 싱글톤 키워드를 사용하여 qmldir 파일에 정의되어야 하며, QML 파일에서 싱글톤을 사용하여 qmldir을 가져와야 합니다.
QML_SINGLETON 를참조하세요 .
int qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, std::function<QJSValue (QQmlEngine *, QJSEngine *)> callback)
이 함수는 특정 uri 및 typeName 에 지정된 버전으로 싱글톤 타입 공급자 callback 를 versionMajor 및 versionMinor 에 등록하는 데 사용할 수 있습니다.
싱글톤 타입을 설치하면 개발자는 클라이언트에서 해당 타입의 개별 인스턴스를 인스턴스화할 필요 없이 클라이언트에 임의의 기능(메서드 및 속성)을 제공할 수 있습니다.
싱글톤 타입은 QObject 또는 QJSValue 일 수 있습니다. 이 함수는 QJSValue 을 싱글톤 타입으로 반환하는 싱글톤 타입 공급자 함수를 등록하는 데 사용해야 합니다.
참고: QJSValue 싱글톤 유형 속성은 변경된 경우 바인딩 재평가를 트리거하지 않습니다.
사용법:
// First, define the singleton type provider function (callback). static QJSValue example_qjsvalue_singletontype_provider(QQmlEngine *engine, QJSEngine *scriptEngine) { Q_UNUSED(engine) static int seedValue = 5; QJSValue example = scriptEngine->newObject(); example.setProperty("someProperty", seedValue++); return example; } // Second, register the singleton type provider with QML by calling this function in an initialization function. qmlRegisterSingletonType("Qt.example.qjsvalueApi", 1, 0, "MyApi", example_qjsvalue_singletontype_provider);
또는 C++11 람다를 사용할 수 있습니다:
qmlRegisterSingletonType("Qt.example.qjsvalueApi", 1, 0, "MyApi", [](QQmlEngine *engine, QJSEngine *scriptEngine) -> QJSValue { Q_UNUSED(engine) static int seedValue = 5; QJSValue example = scriptEngine->newObject(); example.setProperty("someProperty", seedValue++); return example; });
QML에서 등록된 싱글톤 타입을 사용하려면 싱글톤 타입을 임포트해야 합니다.
import QtQuick 2.0 import Qt.example.qjsvalueApi 1.0 as ExampleApi Item { id: root property int someValue: ExampleApi.MyApi.someProperty }
QML_SINGLETON 및 C++와 QML 간의 올바른 통합 방법 선택하기를참조하세요 .
template <typename T> int qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, std::function<QObject *(QQmlEngine *, QJSEngine *)> callback)
이 함수는 특정 uri 및 typeName 에 지정된 버전으로 싱글톤 타입 공급자 callback 를 versionMajor 및 versionMinor 에 등록하는 데 사용할 수 있습니다.
싱글톤 타입을 URI에 설치하면 개발자는 클라이언트에서 타입의 개별 인스턴스를 인스턴스화할 필요 없이 클라이언트에 임의의 기능(메소드 및 프로퍼티)을 제공할 수 있습니다.
싱글톤 타입은 QObject 또는 QJSValue 일 수 있습니다. 이 함수는 주어진 타입 T의 QObject 을 싱글톤 타입으로 반환하는 싱글톤 타입 공급자 함수를 등록하는 데 사용해야 합니다.
QObject 싱글톤 타입은 등록된 타입 이름을 통해 참조할 수 있으며, 이 타입 이름은 Connections 타입의 대상으로 사용하거나 다른 타입 아이디처럼 사용할 수 있습니다. 단, QObject 싱글톤 유형 속성은 별칭을 붙일 수 없다는 예외가 있습니다.
참고: 싱글톤 유형 공급자로부터 반환된 QObject 싱글톤 유형 인스턴스는 객체에 명시적인 QQmlEngine::CppOwnership 플래그가 설정되어 있지 않는 한 QML 엔진이 소유합니다.
사용법:
// First, define your QObject which provides the functionality. class SingletonTypeExample : public QObject { Q_OBJECT Q_PROPERTY (int someProperty READ someProperty WRITE setSomeProperty NOTIFY somePropertyChanged) public: SingletonTypeExample(QObject *parent = nullptr) : QObject(parent), m_someProperty(0) { } ~SingletonTypeExample() {} Q_INVOKABLE int doSomething() { setSomeProperty(5); return m_someProperty; } int someProperty() const { return m_someProperty; } void setSomeProperty(int val) { m_someProperty = val; emit somePropertyChanged(val); } signals: void somePropertyChanged(int newValue); private: int m_someProperty; }; // Second, define the singleton type provider function (callback). static QObject *example_qobject_singletontype_provider(QQmlEngine *engine, QJSEngine *scriptEngine) { Q_UNUSED(engine) Q_UNUSED(scriptEngine) SingletonTypeExample *example = new SingletonTypeExample(); return example; } // Third, register the singleton type provider with QML by calling this function in an initialization function. qmlRegisterSingletonType<SingletonTypeExample>("Qt.example.qobjectSingleton", 1, 0, "MyApi", example_qobject_singletontype_provider);
또는 C++11 람다를 사용할 수 있습니다:
qmlRegisterSingletonType<SingletonTypeExample>("Qt.example.qobjectSingleton", 1, 0, "MyApi", [](QQmlEngine *engine, QJSEngine *scriptEngine) -> QObject * { Q_UNUSED(engine) Q_UNUSED(scriptEngine) SingletonTypeExample *example = new SingletonTypeExample(); return example; });
QML에서 등록된 싱글톤 타입을 사용하려면 싱글톤 타입을 임포트해야 합니다.
import QtQuick 2.0 import Qt.example.qobjectSingleton 1.0 Item { id: root property int someValue: MyApi.someProperty Component.onCompleted: { someValue = MyApi.doSomething() } }
QML_SINGLETON 및 C++와 QML 간의 올바른 통합 방법 선택하기를참조하세요 .
template <typename T> int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName)
이 템플릿 함수는 uri 에서 가져온 라이브러리에 versionMajor 및 versionMinor 에서 구성한 버전 번호를 가진 qmlName 이라는 이름의 C++ 타입을 QML 시스템에 등록합니다.
QML 유형 ID를 반환합니다.
이 템플릿 함수에는 두 가지 형태가 있습니다:
template<typename T> int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName); template<typename T, int metaObjectRevision> int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName);
전자는 유형 T를 새 유형으로 등록하는 표준 형식입니다. 후자는 클래스의 특정 개정판을 지정된 버전에 등록할 수 있습니다( 유형 개정판 및 버전 참조).
예를 들어, 이것은 C++ 클래스 MySliderItem
를 "com.mycompany.qmlcomponents"라는 유형 네임스페이스의 버전 1.0에 대해 Slider
이라는 QML 유형으로 등록합니다:
qmlRegisterType<MySliderItem>("com.mycompany.qmlcomponents", 1, 0, "Slider");
이렇게 등록되면 지정된 유형 네임스페이스와 버전 번호를 가져와서 해당 유형을 QML에서 사용할 수 있습니다:
import com.mycompany.qmlcomponents 1.0 Slider { // ... }
라이브러리가 실제 라이브러리 버전보다 이전 버전에 유형을 등록하는 것은 지극히 합리적이라는 점에 유의하세요. 실제로 새 라이브러리에서는 일부 유형의 고급 버전을 사용할 수 있더라도 이전 버전으로 작성된 QML이 계속 작동하도록 허용하는 것이 정상입니다.
QML_ELEMENT, QML_NAMED_ELEMENT() 및 C++와 QML 간의 올바른 통합 방법 선택하기를참조하세요 .
int qmlRegisterType(const QUrl &url, const char *uri, int versionMajor, int versionMinor, const char *qmlName)
이 함수는 uri 에서 가져온 라이브러리에 versionMajor 및 versionMinor 에서 구성된 버전 번호를 가진 qmlName 이라는 이름의 유형을 QML 시스템에 등록합니다. 이 유형은 url 에 있는 QML 파일에 의해 정의됩니다. URL은 절대 URL이어야 합니다(예: url.isRelative() == false).
일반적으로 QML 파일은 다른 QML 파일에서 직접 유형으로 로드하거나 qmldir 파일을 사용하여 로드할 수 있습니다. 이 함수를 사용하면 시작 시 유형 매핑을 절차적으로 결정해야 하는 경우와 같이 C++ 코드에서 파일을 유형에 등록할 수 있습니다.
등록에 성공하지 못하면 -1을 반환합니다.
int qmlRegisterTypeNotAvailable(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &message)
이 함수는 uri 에서 가져온 유형 네임스페이스에 versionMajor 및 versionMinor 에서 구성된 버전 번호를 가진 qmlName 이라는 이름으로 유형을 QML 시스템에 등록하지만 유형을 인스턴스화하려고 시도하면 지정된 오류 message 가 발생합니다.
일반적으로 플러그인에서 내보낸 타입은 수정되어야 합니다. 그러나 C++ 유형을 사용할 수 없는 경우 최소한 QML 유형 이름을 "예약"하고 사용할 수 없는 유형의 사용자에게 의미 있는 오류 메시지를 제공해야 합니다.
QML 유형 ID를 반환합니다.
예시:
#ifdef NO_GAMES_ALLOWED qmlRegisterTypeNotAvailable("MinehuntCore", 0, 1, "Game", "Get back to work, slacker!"); #else qmlRegisterType<MinehuntGame>("MinehuntCore", 0, 1, "Game"); #endif
이렇게 하면 "MinehuntCore" 유형 네임스페이스를 가져와서 이 유형을 사용하려고 시도하는 모든 QML이 오류 메시지를 생성합니다:
fun.qml: Get back to work, slacker! Game { ^
이 기능이 없으면 일반적인 "게임은 유형이 아닙니다."라는 메시지가 표시됩니다.
QML_UNAVAILABLE, qmlRegisterUncreatableType() 및 C++와 QML 간의 올바른 통합 방법 선택도참조하세요 .
int qmlRegisterUncreatableMetaObject(const QMetaObject &staticMetaObject, const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason)
이 함수는 uri 에서 가져온 라이브러리에서 qmlName 이라는 이름으로 versionMajor 및 versionMinor 에서 구성된 버전 번호를 가진 staticMetaObject 및 해당 확장자를 QML 시스템에 등록합니다.
메타 객체의 인스턴스는 생성할 수 없습니다. 사용자가 만들려고 하면 reason 이라는 오류 메시지가 출력됩니다.
이 함수는 Q_NAMESPACE 네임스페이스를 등록할 때 유용합니다.
QML 유형 ID를 반환합니다.
예를 들어
namespace MyNamespace { Q_NAMESPACE enum MyEnum { Key1, Key2, }; Q_ENUM_NS(MyEnum) } //... qmlRegisterUncreatableMetaObject(MyNamespace::staticMetaObject, "io.qt", 1, 0, "MyNamespace", "Access to enums & flags only");
이제 QML 측에서 등록된 열거형을 사용할 수 있습니다:
Component.onCompleted: console.log(MyNamespace.Key2)
QML_ELEMENT, QML_NAMED_ELEMENT() 및 QML_UNCREATABLE()도 참조하세요 .
template <typename T> int qmlRegisterUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &message)
이 템플릿 함수는 uri 에서 가져온 라이브러리에 versionMajor 및 versionMinor 에서 구성된 버전 번호를 가진 qmlName 이라는 이름의 C++ 타입을 QML 시스템에 등록합니다.
유형에 이름과 유형이 있지만 생성할 수 없으며, 생성을 시도하면 지정된 오류 message 가 발생합니다.
이 함수는 유형이 첨부된 속성이나 열거형 값을 제공하기 위한 용도로만 사용되는 경우에 유용합니다.
QML 타입 ID를 반환합니다.
QML_UNCREATABLE(), qmlRegisterTypeNotAvailable() 및 C++와 QML 간의 올바른 통합 방법 선택하기를참조하세요 .
int qmlTypeId(const char *uri, int versionMajor, int versionMinor, const char *qmlName)
특정 uri 에 qmlName 라는 이름으로 등록되고 versionMajor 및 versionMinor 에 지정된 버전으로 등록된 타입의 QML 타입 ID를 반환합니다.
이 함수는 qmlRegisterType() 및 qmlRegisterSingletonType()와 같은 QML 타입 등록 함수와 동일한 값을 반환합니다.
qmlName, uri 및 versionMajor 에 등록된 유형이 일치하지만 versionMinor 에 지정된 부 버전이 더 높은 경우 가장 가까운 부 버전을 가진 유형의 ID가 반환됩니다.
일치하는 유형을 찾을 수 없거나 지정된 매개변수 중 하나가 유효하지 않으면 -1을 반환합니다.
참고: : 모듈이 아직 어떤 엔진에서도 액세스되지 않은 경우에도 qmlTypeId는 모듈을 사용 가능하게 만들려고 시도합니다. 이로 인해 모듈에 처음 액세스할 때 오버헤드가 발생할 수 있습니다. 존재하지 않는 모듈에서 유형을 찾으려고 하면 항상 이 오버헤드가 발생합니다.
QML_ELEMENT, QML_NAMED_ELEMENT, QML_SINGLETON, qmlRegisterType() 및 qmlRegisterSingletonType()도 참조하세요 .
void qmlUnregisterModuleImport(const char *uri, int moduleMajor, const char *import, int importMajor = QQmlModuleImportLatest, int importMinor = QQmlModuleImportLatest)
이전에 qmlRegisterModuleImport()에 등록된 모듈 가져오기를 제거합니다.
이 함수를 호출하면 버전 importMajor 의 import.importMinor 는 버전 moduleMajor 의 uri 을 더 이상 자동으로 가져오지 않습니다. 버전 확인은 qmlRegisterModuleImport()와 동일한 방식으로 작동합니다.
qmlRegisterModuleImport()도 참조하세요 .
매크로 문서
QML_ADDED_IN_VERSION(MAJOR, MINOR)
둘러싸는 타입 또는 네임스페이스가 지정된 MAJOR.MINOR 버전에 추가되었음을 선언합니다. 이 버전은 메서드, 슬롯 또는 신호에 대한 Q_REVISION() 매크로와 Q_PROPERTY()로 선언된 속성에 대한 REVISION() 속성에 의해 주어진 모든 개정판과 일치하는 것으로 간주됩니다.
QML_ADDED_IN_VERSION()은 QML_ELEMENT, QML_NAMED_ELEMENT(), QML_ANONYMOUS, 또는 QML_INTERFACE 매크로를 통해 유형 또는 네임스페이스를 QML에서 사용할 수 있는 경우에만 적용됩니다.
유형이 속한 QML 모듈을 이 방법으로 결정된 버전보다 낮은 버전으로 가져오는 경우 QML 유형은 보이지 않습니다.
QML_ELEMENT 및 QML_NAMED_ELEMENT 을참조하세요 .
QML_ANONYMOUS
둘러싸는 형식을 사용할 수 있지만 QML에서는 익명인 것으로 선언합니다. 이 유형은 QML에서 프로퍼티를 선언하는 데 생성하거나 사용할 수 없지만 C++에서 전달하면 인식됩니다. QML에서는 이 유형의 프로퍼티가 C++로 선언된 경우 사용할 수 있습니다.
QML_ELEMENT, QML_NAMED_ELEMENT(), QML_UNCREATABLE() 및 QML_INTERFACE 을참조하세요 .
QML_ATTACHED(ATTACHED_TYPE)
둘러싸는 유형이 다른 유형에 첨부 프로퍼티로 ATTACHED_TYPE 를 첨부한다고 선언합니다. 이는 해당 유형이 QML_ELEMENT 또는 QML_NAMED_ELEMENT() 매크로를 사용하여 QML에 노출된 경우에 적용됩니다.
참고: 클래스 이름은 이미 네임스페이스 내에 있는 경우에도 정규화된 이름이어야 합니다.
QML_ELEMENT, QML_NAMED_ELEMENT(), qmlAttachedPropertiesObject() 및 첨부된 속성 제공을참조하세요 .
[since 6.5]
QML_CONSTRUCTIBLE_VALUE
주변 값 유형을 생성 가능한 것으로 표시합니다. 즉, 이 유형의 프로퍼티에 JavaScript 값을 할당할 때 정확히 하나의 인수를 받는 유형의 Q_INVOKABLE 생성자를 사용할 수 있습니다.
다음과 같이 구성 가능한 값 유형을 선언할 수 있습니다:
class MyValueType { Q_GADGET QML_VALUE_TYPE(myValueType) QML_CONSTRUCTIBLE_VALUE public: Q_INVOKABLE MyValueType(double d); // ... };
위의 유형을 사용하면 다음 QML 코드는 지정된 생성자를 사용하여 MyValueType
값을 생성하고 이를 프로퍼티에 할당합니다.
QtObject { property myValueType v: 5.4 }
이 방법으로 값 목록을 구성할 수도 있습니다:
QtObject { property list<myValueType> v: [5.4, 4.5, 3.3] }
값 유형을 주소 지정이 가능하도록 만들면 유형 어설션에서 이러한 유형을 사용하여 명시적으로 구성할 수 있습니다:
pragma ValueTypeBehavior: Addressable QtObject { function process(d: real) { let v = d as myValueType; // v is a myValueType now, not a number } }
이 매크로는 Qt 6.5에 도입되었습니다.
QML_VALUE_TYPE 를참조하십시오 .
QML_DECLARE_TYPE
Q_DECLARE_METATYPE(TYPE *)
및 Q_DECLARE_METATYPE(QQmlListProperty<TYPE>)
QML_DECLARE_TYPEINFO(Type, Flags)
지정된 Flags 에 설명된 대로 지정된 Type 의 추가 속성을 선언합니다.
현재 지원되는 유일한 유형 정보는 QML_HAS_ATTACHED_PROPERTIES
으로, Type 이 첨부된 속성을 지원한다고 선언합니다. Type 에 QML_ATTACHED 매크로가 포함된 경우 QML_DECLARE_TYPEINFO()는 필요하지 않습니다.
QML_ELEMENT
클래스 또는 네임스페이스 이름을 QML 요소 이름으로 사용하여 둘러싸는 유형 또는 네임스페이스를 QML에서 사용할 수 있도록 선언합니다.
예를 들어, 이렇게 하면 C++ 클래스 Slider
를 Slider
이라는 QML 유형으로 사용할 수 있습니다. 모든 속성, 호출 가능한 메서드 및 열거 형이 노출됩니다.
class Slider : public QObject { Q_OBJECT QML_ELEMENT Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged FINAL) // ... public: enum Slippiness { Dry, Wet, Icy }; Q_ENUM(Slippiness) Q_INVOKABLE void slide(Slippiness slippiness); // ... }
빌드 시스템을 사용하여 주 버전이 1
인 유형 네임스페이스 com.mycompany.qmlcomponents에 유형을 등록할 수 있습니다. qmake의 경우 프로젝트 파일에 다음을 지정합니다:
CONFIG += qmltypes QML_IMPORT_NAME = com.mycompany.qmlcomponents QML_IMPORT_MAJOR_VERSION = 1
CMake를 사용하면 URI와 버전을 qt_add_qml_module에 전달합니다.
qt6_add_qml_module(myapp URI com.mycompany.qmlcomponents VERSION 1.0 )
일단 등록되면 동일한 타입 네임스페이스와 버전 번호를 가져와서 QML에서 해당 타입을 사용할 수 있습니다:
import com.mycompany.qmlcomponents 1.0 Slider { value: 12 Component.onCompleted: slide(Slider.Icy) // ... }
Q_NAMESPACE 태그가 지정된 네임스페이스를 이 방법으로 사용할 수 있도록 설정하여 여기에 포함된 Q_ENUM_NS 태그가 지정된 열거형을 노출할 수도 있습니다:
namespace MyNamespace { Q_NAMESPACE QML_ELEMENT enum MyEnum { Key1, Key2, }; Q_ENUM_NS(MyEnum) }
그런 다음 QML에서 열거형을 사용할 수 있습니다:
Component.onCompleted: console.log(MyNamespace.Key2)
참고: 클래스의 이름이 같지만 서로 다른 네임스페이스에 있는 경우 두 클래스 모두에 QML_ELEMENT를 사용하면 충돌이 발생할 수 있습니다. 그 중 하나에 QML_NAMED_ELEMENT()를 사용해야 합니다.
참고: 이미 네임스페이스 안에 있는 경우에도 클래스 이름은 정규화된 이름이어야 합니다.
C++과 QML 간의 올바른 통합 방법 선택하기, QML_NAMED_ELEMENT(), Q_REVISION() 및 QML_ADDED_IN_VERSION()도 참조하세요 .
QML_EXTENDED(EXTENDED_TYPE)
둘러싸는 유형이 EXTENDED_TYPE 을 확장으로 사용하여 QML에서 추가 속성, 메서드 및 열거형을 제공한다고 선언합니다. 이는 해당 유형이 QML_ELEMENT 또는 QML_NAMED_ELEMENT() 매크로를 사용하여 QML에 노출된 경우에 적용됩니다.
경고: EXTENDED_TYPE 의 멤버는 암시적으로 FINAL로 취급됩니다.
참고: 이미 네임스페이스 안에 있는 경우에도 클래스 이름은 정규화된 이름이어야 합니다.
QML_ELEMENT, QML_NAMED_ELEMENT(), QML_EXTENDED_NAMESPACE() 및 확장 객체 등록하기를참조하세요 .
QML_EXTENDED_NAMESPACE(EXTENDED_NAMESPACE)
둘러싸는 타입이 EXTENDED_NAMESPACE 을 확장으로 사용하여 QML에서 추가 열거를 제공한다고 선언합니다. 이는 QML_ELEMENT 또는 QML_NAMED_ELEMENT() 매크로를 사용하여 유형이 QML에 노출된 경우에 적용됩니다. 이 기능이 작동하려면 열거형이 메타객체 시스템에 노출되어야 합니다.
예를 들어 다음 C++ 코드를 제공하면
namespace MyNamespace { Q_NAMESPACE enum MyEnum { MyEnumerator = 10 }; Q_ENUM_NS(MyEnum) } class QmlType : public QObject { Q_OBJECT QML_ELEMENT QML_EXTENDED_NAMESPACE(MyNamespace) }
를 사용하면 QML에서 열거형에 액세스할 수 있습니다:
QmlType { property int i: QmlType.MyEnumerator // i will be 10 }
참고: EXTENDED_NAMESPACE는 QObject 또는 QGadget일 수도 있습니다. 이 경우 메서드와 속성도 노출하는 QML_EXTENDED 과 달리 해당 열거형만 노출됩니다.
참고: EXTENDED_NAMESPACE 에는 메타개체가 있어야 합니다. 즉, Q_NAMESPACE 매크로를 포함하는 네임스페이스이거나 QObject/QGadget이어야 합니다.
참고: 이미 네임스페이스 안에 있는 경우에도 클래스 이름은 정규화된 이름이어야 합니다.
QML_ELEMENT, QML_NAMED_ELEMENT(), QML_EXTENDED(), 확장 객체 등록하기, Q_ENUM, 및 Q_ENUM_NS 를참조하세요 .
QML_EXTRA_VERSION(MAJOR, MINOR)
MAJOR.MINOR 에서도 유형을 사용할 수 있어야 한다고 선언합니다. 이는 한 유형을 여러 주요 버전에서 사용할 수 있어야 하는 경우에 유용합니다.
유형은 자동으로 등록됩니다:
- 도입된 주요 버전은 QML_ADDED_IN_VERSION 을 참조하세요.
- 해당 멤버가 도입된 모든 주요 버전.
- 해당 모듈의 현재 주요 버전( QML_REMOVED_IN_VERSION 이전 버전이 아닌 경우).
특히, 위 사이의 PAST_MAJOR_VERSIONS에는 자동으로 등록되지 않습니다. QML_EXTRA_VERSION을 사용하여 추가 주요 버전에 유형을 수동으로 등록할 수 있습니다.
참고: 여러 개의 PAST_MAJOR_VERSION을 유지하면 계산 비용이 많이 듭니다.
QML_ELEMENT 및 QML_ADDED_IN_VERSION 을참조하세요 .
QML_FOREIGN(FOREIGN_TYPE)
둘러싸는 C++ 타입의 QML_ELEMENT, QML_NAMED_ELEMENT(), QML_ANONYMOUS, QML_INTERFACE, QML_UNCREATABLE(), QML_SINGLETON, QML_ADDED_IN_VERSION(), QML_REMOVED_IN_VERSION(), QML_ADDED_IN_MINOR_VERSION(), QML_REMOVED_IN_MINOR_VERSION(), QML_EXTENDED() 또는 QML_EXTENDED_NAMESPACE() 매크로가 둘러싸는 타입에 적용되지 않고 FOREIGN_TYPE 에 적용되도록 선언합니다. 둘러싸는 타입은 여전히 Q_GADGET 또는 Q_OBJECT 매크로를 사용하여 메타 객체 시스템에 등록해야 합니다.
이는 예를 들어 타사 라이브러리에 속해 있어 매크로를 추가하기 위해 수정할 수 없는 유형을 등록하는 데 유용합니다. 네임스페이스를 등록하려면 QML_FOREIGN_NAMESPACE()를 참조하세요.
참고: QML_ELEMENT 대신 QML_NAMED_ELEMENT()를 사용할 수 있습니다. QML_ELEMENT 를 사용하면 요소의 이름이 외부 유형이 아닌 그 안에 포함된 구조체의 이름을 따서 지정됩니다. C++로 고급 QML 확장 작성하기의 외부 객체 통합 장에서 이를 설명합니다.
참고: QML_ATTACHED()는 현재 이와 같이 리디렉션할 수 없습니다. qmlAttachedProperties()를 구현하는 동일한 유형으로 지정해야 합니다.
참고: 클래스 이름은 이미 네임스페이스 안에 있더라도 정규화된 이름이어야 합니다.
QML_ELEMENT, QML_NAMED_ELEMENT() 및 QML_FOREIGN_NAMESPACE()도 참조하세요 .
QML_FOREIGN_NAMESPACE(FOREIGN_NAMESPACE)
둘러싸는 C++ 네임스페이스의 QML_ELEMENT, QML_NAMED_ELEMENT(), QML_ANONYMOUS, QML_INTERFACE, QML_UNCREATABLE(), QML_SINGLETON, QML_ADDED_IN_VERSION(), QML_REMOVED_IN_VERSION(), QML_ADDED_IN_MINOR_VERSION() 또는 QML_REMOVED_IN_MINOR_VERSION() 매크로가 둘러싸는 유형에 적용되지 않고 FOREIGN_NAMESPACE. 둘러싸는 네임스페이스는 여전히 Q_NAMESPACE 매크로를 사용하여 메타 객체 시스템에 등록해야 합니다.
이는 예를 들어 타사 라이브러리에 속해 있어 매크로를 추가하기 위해 수정할 수 없는 네임스페이스를 등록하는 데 유용합니다.
QML_ELEMENT, QML_NAMED_ELEMENT() 및 QML_FOREIGN()도 참조하세요 .
QML_IMPLEMENTS_INTERFACES(interfaces)
이 매크로는 클래스가 구현하는 QML interfaces 을 Qt에 알려줍니다. 이 매크로는 QML_INTERFACE 을 사용하는 클래스와 인터페이스할 때만 사용해야 하며, 그렇지 않으면 Q_INTERFACES 을 사용해야 합니다. QML_ELEMENT 을 통한 선언적 등록이 제대로 작동하려면 이 매크로가 필요합니다.
QML_INTERFACE 와 Q_INTERFACES도 참조하십시오 .
QML_INTERFACE
이 매크로는 둘러싸는 C++ 타입을 QML 시스템에 인터페이스로 등록합니다.
QML에서 인터페이스로 등록된 유형은 메타 객체 시스템에서도 자신을 인터페이스로 선언해야 합니다. 예를 들어
struct FooInterface { QML_INTERFACE public: virtual ~FooInterface(); virtual void doSomething() = 0; }; Q_DECLARE_INTERFACE(FooInterface, "org.foo.FooInterface")
이러한 방식으로 QML에 등록하면 속성 유형으로 사용할 수 있습니다:
Q_PROPERTY(FooInterface *foo READ foo WRITE setFoo)
이 프로퍼티에 QObject 서브클래스를 할당하면 QML 엔진이 자동으로 FooInterface*
로 인터페이스 형변환을 수행합니다.
인터페이스 유형은 암시적으로 익명이며 QML에서 생성할 수 없습니다.
참고: QML_INTERFACE를 사용하여 유형에서 상속할 때는 Q_INTERFACES 대신 QML_IMPLEMENTS_INTERFACES 을 사용합니다.
QML_IMPLEMENTS_INTERFACES(), QML_ELEMENT, QML_NAMED_ELEMENT(), QML_UNCREATABLE() 및 QML_ANONYMOUS도 참조하세요 .
QML_NAMED_ELEMENT(name)
요소 이름으로 name 을 사용하여 QML에서 사용할 수 있는 둘러싸는 유형 또는 네임스페이스를 선언합니다. 그렇지 않으면 QML_ELEMENT 과 동일하게 동작합니다.
class SqlEventDatabase : public QObject { Q_OBJECT QML_NAMED_ELEMENT(EventDatabase) // ... };
C++과 QML 간의 올바른 통합 방법 선택 및 QML_ELEMENT도 참조하세요 .
QML_REMOVED_IN_VERSION(MAJOR, MINOR)
둘러싸는 유형 또는 네임스페이스가 지정된 MAJOR.MINOR 버전에서 제거되었음을 선언합니다. 이는 주로 QML 유형의 구현을 교체할 때 유용합니다. 해당 QML_ADDED_IN_VERSION()가 동일한 QML 이름의 다른 유형 또는 네임스페이스에 있는 경우, 제거된 유형은 MAJOR.MINOR 보다 낮은 버전의 모듈을 가져올 때 사용되고 추가된 유형은 MAJOR.MINOR 보다 크거나 같은 버전의 모듈을 가져올 때 사용됩니다.
QML_REMOVED_IN_VERSION()은 QML_ELEMENT, QML_NAMED_ELEMENT(), QML_ANONYMOUS, 또는 QML_INTERFACE 매크로를 통해 유형 또는 네임스페이스를 QML에서 사용할 수 있는 경우에만 적용됩니다.
QML_ELEMENT 및 QML_NAMED_ELEMENT 을참조하십시오 .
QML_SEQUENTIAL_CONTAINER(VALUE_TYPE)
이 매크로는 VALUE_TYPE 요소의 시퀀스를 관리하는 순차 컨테이너로 둘러싸는 유형 또는 참조 유형을 선언합니다. VALUE_TYPE 실제 값 유형이거나 객체 유형에 대한 포인터일 수 있습니다. 컨테이너는 일반적으로 템플릿이므로 이 매크로를 실제 컨테이너 선언에 추가할 수 있는 경우는 거의 없습니다. QML_FOREIGN 을 사용하여 템플릿 인스턴스화에 유형 등록을 첨부해야 합니다. 이 기술을 사용하면 예를 들어 다음과 같이 순차적인 컨테이너를 선언할 수 있습니다:
class IntDequeRegistration { Q_GADGET QML_FOREIGN(std::deque<int>) QML_ANONYMOUS QML_SEQUENTIAL_CONTAINER(int) };
그런 다음 QML에서 컨테이너를 자바스크립트 배열처럼 사용할 수 있습니다.
class Maze { Q_OBJECT Q_ELEMENT // 0: North, 1: East, 2: South, 3: West Q_PROPERTY(std::deque<int> solution READ solution CONSTANT FINAL) [...] }
Item { Maze { id: maze } function showSolution() { maze.solution.forEach([...]) } }
참고: QML 값 유형의 경우 QList 은 순차 컨테이너로 자동 등록됩니다. QML 객체 유형의 경우 QQmlListProperty 입니다. 이러한 등록을 추가할 필요가 없습니다.
참고: 현재 컨테이너에 사용자 정의 이름을 지정할 수 없습니다. QML_NAMED_ELEMENT 에 전달된 모든 인수는 무시됩니다. 자동으로 등록된 순차적 컨테이너는 익숙한 목록<...> 이름(예: 목록< QtObject> 또는 목록<글꼴>)으로 사용할 수 있습니다 .
참고: 클래스 이름은 이미 네임스페이스 안에 있더라도 정규화된 이름이어야 합니다.
QML_ANONYMOUS 및 QML_FOREIGN()도 참조하세요 .
QML_SINGLETON
둘러싸는 타입을 QML에서 싱글톤으로 선언합니다. 이는 유형이 Q_OBJECT 이고 QML에서 사용할 수 있는 경우에만 적용됩니다( QML_ELEMENT 또는 QML_NAMED_ELEMENT() 매크로를 사용하여). 기본적으로 각 QQmlEngine 은 타입이 처음 액세스될 때 타입의 기본 생성자 또는 T *create(QQmlEngine *, QJSEngine *)
서명의 정적 팩토리 함수를 사용하여 싱글톤 인스턴스를 생성하려고 시도합니다. 둘 다 존재하고 액세스할 수 있는 경우 기본 생성자가 선호됩니다. 기본 생성자도 없고 팩토리 함수도 없는 경우 싱글톤에 액세스할 수 없습니다. QML 엔진은 일반적으로 싱글톤의 소유권을 가지며 엔진 자체가 파괴되면 싱글톤을 삭제합니다. 싱글톤에서 QJSEngine::setObjectOwnership()를 호출하여 이를 방지할 수 있습니다.
기본 구성 가능한 클래스를 싱글톤으로 선언하려면 QML_SINGLETON을 추가하기만 하면 됩니다:
class MySingleton : public QObject { Q_OBJECT QML_ELEMENT QML_SINGLETON // Q_PROPERTY( ... ) public: // members, Q_INVOKABLE functions, etc. };
싱글톤 클래스가 기본 구성 가능 클래스는 아니지만 수정할 수 있는 경우 팩토리 함수를 추가하여 액세스할 수 있도록 만들 수 있습니다:
class MySingleton : public QObject { Q_OBJECT QML_ELEMENT QML_SINGLETON // Q_PROPERTY( ... ) public: static MySingleton *create(QQmlEngine *qmlEngine, QJSEngine *jsEngine) { MySingleton *result = nullptr; // Create the object using some custom constructor or factory. // The QML engine will assume ownership and delete it, eventually. return result; } // members, Q_INVOKABLE functions, etc };
클래스를 수정할 수 없고 기본 생성자나 적절한 팩토리 함수가 없는 경우 QML_FOREIGN 래퍼를 제공하여 팩토리 함수를 정의할 수 있습니다:
struct SingletonForeign { Q_GADGET QML_FOREIGN(MySingleton) QML_SINGLETON QML_NAMED_ELEMENT(MySingleton) public: static MySingleton *create(QQmlEngine *, QJSEngine *engine) { MySingleton *result = nullptr; // Create the instance using some custom constructor or factory. // The QML engine will assume ownership and delete it, eventually. return result; } };
마지막으로, 생성을 제어할 수 없는 특정 싱글톤 객체 하나를 제공하려는 경우 팩토리 함수에서 이를 반환할 수 있습니다. 이는 qmlRegisterSingletonInstance 함수를 대체할 수 있습니다. 호출하는 경우
qmlRegisterSingletonInstance("MyModule", 1, 0, "MySingleton", myObject);
를 호출하는 경우 MySingleton *
대신 다음과 같이 할 수 있습니다:
struct SingletonForeign { Q_GADGET QML_FOREIGN(MySingleton) QML_SINGLETON QML_NAMED_ELEMENT(MySingleton) public: // Initialize this using myObject where you would previously // call qmlRegisterSingletonInstance(). inline static MySingleton *s_singletonInstance = nullptr; static MySingleton *create(QQmlEngine *, QJSEngine *engine) { // The instance has to exist before it is used. We cannot replace it. Q_ASSERT(s_singletonInstance); // The engine has to have the same thread affinity as the singleton. Q_ASSERT(engine->thread() == s_singletonInstance->thread()); // There can only be one engine accessing the singleton. if (s_engine) Q_ASSERT(engine == s_engine); else s_engine = engine; // Explicitly specify C++ ownership so that the engine doesn't delete // the instance. QJSEngine::setObjectOwnership(s_singletonInstance, QJSEngine::CppOwnership); return s_singletonInstance; } private: inline static QJSEngine *s_engine = nullptr; };
이렇게 하면 기존 클래스 MySingleton
가 MySingleton
이라는 QML 싱글톤으로 선언됩니다. s_singletonInstance
멤버를 설정하여 사용하기 전에 언제든지 인스턴스를 지정할 수 있습니다. 이 과정에서 MySingleton
자체를 수정할 필요는 없습니다.
참고: 이 패턴은 싱글톤이 여러 QML 엔진에 의해 액세스되거나 싱글톤에 액세스하는 QML 엔진이 싱글톤 객체 자체와 다른 스레드 선호도를 갖는 경우에는 작동하지 않습니다. 위와 같이 create()
메서드의 파라미터를 통해 엔진의 ID와 스레드 선호도를 확인하여 어설트할 수 있습니다.
QML_ELEMENT, QML_NAMED_ELEMENT(), qmlRegisterSingletonInstance(), QQmlEngine::singletonInstance() 및 QML의 싱글톤도참조하세요 .
[since 6.5]
QML_STRUCTURED_VALUE
주변 값 유형을 구조화된 것으로 표시합니다. 구조화된 값 유형은 자바스크립트 객체에서 속성별로 구성할 수 있으며, 가급적 그렇게 하는 것이 좋습니다. 그러나 구조화된 값 유형은 항상 QML_CONSTRUCTIBLE_VALUE 입니다. 즉, 기본 유형에서 구성을 처리하기 위해 Q_INVOKABLE 생성자를 제공할 수 있습니다.
다음과 같이 구조화된 값 타입을 선언할 수 있습니다:
class MyValueType { Q_GADGET QML_VALUE_TYPE(myValueType) QML_STRUCTURED_VALUE Q_PROPERTY(double d READ d WRITE setD) Q_PROPERTY(string e READ e WRITE setE) // ... };
그런 다음 다음과 같이 이 유형의 프로퍼티를 채울 수 있습니다:
QtObject { property myValueType v: ({d: 4.4, e: "a string"}) }
추가 괄호는 자바스크립트 코드 블록으로 해석될 수 있는 것과 자바스크립트 객체를 구분하기 위해 필요합니다.
이 방법으로 값 목록을 구성할 수도 있습니다:
QtObject { property list<myValueType> v: [ {d: 4.4, e: "a string"}, {d: 7.1, e: "another string"} ] }
값 유형을 주소 지정이 가능하도록 만들면 유형 어설션에서 이러한 유형을 사용하여 명시적으로 구성할 수 있습니다:
pragma ValueTypeBehavior: Addressable QtObject { function process(d: real) { let v = {d: d, e: objectName} as myValueType; // v is a myValueType now } }
이 매크로는 Qt 6.5에 도입되었습니다.
QML_VALUE_TYPE 와 QML_CONSTRUCTIBLE_VALUE 를참조하십시오 .
QML_UNAVAILABLE
이 매크로는 QML에서 둘러싸는 유형을 사용할 수 없도록 선언합니다. 이 매크로는 QQmlTypeNotAvailable
라는 내부 더미 유형을 QML_FOREIGN() 유형으로 등록하고, 사용자가 지정한 추가 QML 매크로를 사용합니다.
일반적으로 모듈에서 내보내는 유형은 고정되어 있어야 합니다. 그러나 C++ 유형을 사용할 수 없는 경우 최소한 QML 유형 이름을 "예약"하고 사용할 수 없는 유형의 사용자에게 의미 있는 오류 메시지를 제공해야 합니다.
예시:
#ifdef NO_GAMES_ALLOWED struct MinehuntGame { Q_GADGET QML_NAMED_ELEMENT(Game) QML_UNAVAILABLE QML_UNCREATABLE("Get back to work, slacker!"); }; #else class MinehuntGame : public QObject { Q_OBJECT QML_NAMED_ELEMENT(Game) // ... }; #endif
이렇게 하면 "Game" 유형을 사용하려고 시도하는 모든 QML에 오류 메시지가 표시됩니다:
fun.qml: Get back to work, slacker! Game { ^
이 기술을 사용하면 완전한 QObject 이 아닌 Q_GADGET 구조체만 있으면 오류 메시지를 사용자 지정할 수 있습니다. QML_UNCREATABLE () 없이도 QML_UNAVAILABLE은 완전히 알 수 없는 유형에 대해 일반적인 "유형이 아닙니다"보다 더 구체적인 오류 메시지를 생성합니다.
참고: 클래스 이름은 이미 네임스페이스 내에 있더라도 정규화된 이름이어야 합니다.
QML_ELEMENT, QML_NAMED_ELEMENT(), QML_UNCREATABLE() 및 QML_FOREIGN()도 참조하세요 .
QML_UNCREATABLE(reason)
둘러싸는 타입을 QML에서 생성할 수 없음을 선언합니다. 이는 QML_ELEMENT 또는 QML_NAMED_ELEMENT() 매크로를 통해 QML에서 해당 유형을 사용할 수 있는 경우에 적용됩니다. QML에서 유형을 생성하려는 시도가 감지되면 reason 이 오류 메시지로 전송됩니다.
특히 QML_ANONYMOUS 로 노출된 타입이나 QML_ELEMENT 또는 QML_NAMED_ELEMENT()로 노출된 네임스페이스와 같이 일부 QML 타입은 암시적으로 생성할 수 없습니다.
Qt 6.0부터는 표준 메시지를 사용하는 이유 대신 ""를 사용할 수 있습니다.
QML_ELEMENT, QML_NAMED_ELEMENT() 및 QML_ANONYMOUS 를참조하십시오 .
QML_VALUE_TYPE(name)
name 을 이름으로 사용하여 QML에서 사용할 수 있는 둘러싸는 유형 또는 네임스페이스를 선언합니다. 유형은 값 유형이어야 하고 이름은 소문자여야 합니다.
class MyValueType { Q_GADGET QML_VALUE_TYPE(myValueType) // ... };
C++과 QML 간의 올바른 통합 방법 선택하기 및 QML_NAMED_ELEMENT 를참조하세요 .
© 2025 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.