QQmlEngine Class
Die Klasse QQmlEngine bietet eine Umgebung zur Instanziierung von QML-Komponenten. Mehr...
Kopfzeile: | #include <QQmlEngine> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Qml) target_link_libraries(mytarget PRIVATE Qt6::Qml) |
qmake: | QT += qml |
Vererbt: | QJSEngine |
Vererbt von: |
Eigenschaften
- offlineStoragePath : QString
Öffentliche Funktionen
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 |
Öffentliche Slots
void | retranslate() |
Signale
void | exit(int retCode) |
(since 6.5) void | offlineStoragePathChanged() |
void | quit() |
void | warnings(const QList<QQmlError> &warnings) |
Statische öffentliche Mitglieder
QQmlContext * | contextForObject(const QObject *object) |
void | setContextForObject(QObject *object, QQmlContext *context) |
Reimplementierte geschützte Funktionen
virtual bool | event(QEvent *e) override |
Verwandte Nicht-Mitglieder
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) |
Makros
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) |
Detaillierte Beschreibung
Eine QQmlEngine wird verwendet, um components und daraus erstellte Objekte zu verwalten und ihre Bindungen und Funktionen auszuführen. QQmlEngine erbt auch von QJSEngine, was eine nahtlose Integration zwischen Ihren QML-Komponenten und JavaScript-Code ermöglicht.
Jede QML-Komponente wird in einem QQmlContext instanziiert. In QML sind die Kontexte hierarchisch angeordnet und diese Hierarchie wird von der QQmlEngine verwaltet. Standardmäßig werden die Komponenten im root context instanziiert.
Siehe auch QQmlComponent, QQmlContext, QML Global Object, und QQmlApplicationEngine.
Dokumentation der Eigenschaften
offlineStoragePath : QString
Diese Eigenschaft enthält das Verzeichnis für die Speicherung von Offline-Benutzerdaten
Gibt das Verzeichnis zurück, in dem SQL und andere Offline-Speicher abgelegt sind.
Die mit openDatabaseSync()
erstellten SQL-Datenbanken werden hier gespeichert.
Die Vorgabe ist QML/OfflineStorage im plattformüblichen Benutzeranwendungsdatenverzeichnis.
Beachten Sie, dass der Pfad möglicherweise noch nicht im Dateisystem vorhanden ist. Daher sollte der Aufrufer, der neue Dateien an diesem Ort erstellen möchte, diesen zuerst erstellen - siehe QDir::mkpath().
Zugriffsfunktionen:
QString | offlineStoragePath() const |
void | setOfflineStoragePath(const QString &dir) |
Benachrichtigungssignal:
void | offlineStoragePathChanged() |
Siehe auch Qt Quick Local Storage QML Types.
Dokumentation der Mitgliedsfunktionen
[explicit]
QQmlEngine::QQmlEngine(QObject *parent = nullptr)
Erstellen Sie eine neue QQmlEngine mit der angegebenen parent.
[override virtual noexcept]
QQmlEngine::~QQmlEngine()
Zerstört das QQmlEngine.
Alle QQmlContext's, die auf dieser Engine erstellt wurden, werden ungültig gemacht, aber nicht zerstört (es sei denn, sie sind dem QQmlEngine Objekt übergeordnet).
Siehe ~QJSEngine() für Details zum Aufräumen der JS-Engine.
void QQmlEngine::addImageProvider(const QString &providerId, QQmlImageProviderBase *provider)
Legt die provider für Bilder fest, die über das Schema image: url mit dem Host providerId angefordert werden. QQmlEngine übernimmt den Besitz von provider.
Bildanbieter ermöglichen die Unterstützung von Pixmap- und Threaded-Image-Anforderungen. Einzelheiten zur Implementierung und Verwendung von Bildanbietern finden Sie in der Dokumentation QQuickImageProvider.
Alle erforderlichen Bildanbieter sollten der Engine hinzugefügt werden, bevor QML-Quelldateien geladen werden.
Siehe auch removeImageProvider(), QQuickImageProvider, und QQmlImageProviderBase.
void QQmlEngine::addImportPath(const QString &path)
Fügt path als ein Verzeichnis hinzu, in dem die Engine nach installierten Modulen in einer URL-basierten Verzeichnisstruktur sucht.
path kann ein lokales Dateisystemverzeichnis, ein Qt-Ressourcenpfad (:/imports
), eine Qt-Ressourcenurl (qrc:/imports
) oder eine URL sein.
Die path wird in eine kanonische Form umgewandelt, bevor sie der Importpfadliste hinzugefügt wird.
Die neu hinzugefügte path wird an erster Stelle in importPathList() stehen.
Siehe auch setImportPathList(), QML-Module und QML-Importpfad
void QQmlEngine::addPluginPath(const QString &path)
Fügt path als Verzeichnis hinzu, in dem die Engine nach nativen Plugins für importierte Module (auf die in der Datei qmldir
verwiesen wird) sucht.
Standardmäßig enthält die Liste nur .
, d. h. die Engine sucht im Verzeichnis der Datei qmldir
selbst.
Das neu hinzugefügte path wird als erstes in der pluginPathList() aufgeführt.
Siehe auch setPluginPathList().
void QQmlEngine::addUrlInterceptor(QQmlAbstractUrlInterceptor *urlInterceptor)
Fügt eine urlInterceptor hinzu, die bei der Auflösung von URLs in QML verwendet wird. Dies gilt auch für URLs, die zum Laden von Skriptdateien und QML-Typen verwendet werden. Die URL-Interceptoren sollten nicht verändert werden, während die Engine Dateien lädt, sonst kann die URL-Auswahl inkonsistent sein. Mehrere URL-Interceptoren werden in der Reihenfolge aufgerufen, in der sie für jede URL hinzugefügt wurden.
QQmlEngine übernimmt nicht die Verantwortung für den Interceptor und löscht ihn nicht.
QUrl QQmlEngine::baseUrl() const
Gibt die Basis-URL für diese Engine zurück. Die Basis-URL wird nur verwendet, um Komponenten aufzulösen, wenn eine relative URL an den QQmlComponent -Konstruktor übergeben wird.
Wenn eine Basis-URL nicht explizit festgelegt wurde, gibt diese Methode das aktuelle Arbeitsverzeichnis der Anwendung zurück.
Siehe auch setBaseUrl().
void QQmlEngine::clearComponentCache()
Löscht den internen Komponenten-Cache der Engine.
Mit dieser Funktion werden die Eigenschaftsmetadaten der meisten Komponenten, die zuvor von der Engine geladen wurden, zerstört. Dies geschieht, indem nicht referenzierte Komponenten aus dem Komponenten-Cache der Engine entfernt werden. Komponenten, die noch referenziert sind, werden nicht gelöscht, da dies mit ziemlicher Sicherheit zu weiteren Abstürzen führen würde.
Wenn keine Komponenten referenziert sind, setzt diese Funktion die Engine in einen Zustand zurück, in dem sie keine geladenen Komponentendaten enthält. Dies kann nützlich sein, um eine kleinere Teilmenge des vorherigen Komponentensatzes neu zu laden oder um eine neue Version einer zuvor geladenen Komponente zu laden.
Sobald der Komponenten-Cache geleert wurde, müssen die Komponenten geladen werden, bevor neue Objekte erstellt werden können.
Hinweis: Alle vorhandenen Objekte, die aus QML-Komponenten erstellt wurden, behalten ihre Typen, auch wenn Sie den Komponenten-Cache löschen. Dies gilt auch für Singleton-Objekte. Wenn Sie nach dem Löschen des Caches weitere Objekte aus demselben QML-Code erstellen, haben die neuen Objekte einen anderen Typ als die alten. Die Zuweisung eines solchen neuen Objekts zu einer Eigenschaft seines deklarierten Typs, die zu einem Objekt gehört, das vor dem Löschen des Caches erstellt wurde, funktioniert nicht.
Als Faustregel gilt: Stellen Sie sicher, dass keine Objekte, die aus QML-Komponenten erstellt wurden, lebendig sind, wenn Sie den Komponenten-Cache leeren.
Siehe auch trimComponentCache() und clearSingletons().
void QQmlEngine::clearSingletons()
Löscht alle Singletons, die die Engine besitzt.
Diese Funktion entfernt alle Singleton-Instanzen und löscht alle QObjects, die der Engine gehören. Dies ist nützlich, um sicherzustellen, dass keine QML-erstellten Objekte übrig sind, bevor clearComponentCache() aufgerufen wird.
QML-Eigenschaften, die QObject-basierte Singleton-Instanzen enthalten, werden null, wenn die Engine das Singleton besitzt oder behalten ihren Wert, wenn die Engine es nicht besitzt. Die Singletons werden nicht automatisch neu erstellt, wenn auf bestehende, mit QML erstellte Objekte zugegriffen wird. Nur wenn neue Komponenten instanziiert werden, werden die Singletons neu erstellt.
Siehe auch clearComponentCache().
[static]
QQmlContext *QQmlEngine::contextForObject(const QObject *object)
Gibt den QQmlContext für den object zurück, oder nullptr, wenn kein Kontext gesetzt wurde.
Wenn QQmlEngine eine QObject instanziiert, wird ihr automatisch ein interner Kontext zugewiesen. Solche internen Kontexte sind schreibgeschützt. Sie können keine Kontexteigenschaften für sie festlegen.
Siehe auch setContextForObject(), qmlContext(), qmlEngine(), und QQmlContext::setContextProperty().
[override virtual protected]
bool QQmlEngine::event(QEvent *e)
Reimplements: QObject::event(QEvent *e).
[signal]
void QQmlEngine::exit(int retCode)
Dieses Signal wird ausgegeben, wenn die von der Engine geladene QML die Ereignisschleife mit dem angegebenen Returncode retCode verlassen möchte.
Siehe auch quit().
QQmlImageProviderBase *QQmlEngine::imageProvider(const QString &providerId) const
Gibt den für providerId eingestellten Bildanbieter zurück, wenn er gefunden wurde; andernfalls wird nullptr
zurückgegeben.
Siehe auch QQuickImageProvider.
QStringList QQmlEngine::importPathList() const
Gibt die Liste der Verzeichnisse zurück, in denen die Engine nach installierten Modulen in einer URL-basierten Verzeichnisstruktur sucht.
Befindet sich beispielsweise /opt/MyApp/lib/imports
im Pfad, dann veranlasst QML, das com.mycompany.Feature
importiert, QQmlEngine, in /opt/MyApp/lib/imports/com/mycompany/Feature/
nach den von diesem Modul bereitgestellten Komponenten zu suchen. Eine Datei qmldir
ist erforderlich, um die Typversionszuordnung und möglicherweise QML-Erweiterungsplugins zu definieren.
Standardmäßig enthält diese Liste die unter QML-Importpfad genannten Pfade.
Siehe auch addImportPath() und setImportPathList().
QQmlIncubationController *QQmlEngine::incubationController() const
Gibt den aktuell eingestellten Inkubationsregler zurück, oder 0, wenn kein Regler eingestellt wurde.
Siehe auch setIncubationController().
QUrl QQmlEngine::interceptUrl(const QUrl &url, QQmlAbstractUrlInterceptor::DataType type) const
Führt die aktuellen URL-Interceptoren auf dem angegebenen url der angegebenen type aus und gibt das Ergebnis zurück.
[since 6.6]
void QQmlEngine::markCurrentFunctionAsTranslationBinding()
Wenn diese Methode innerhalb einer Funktion aufgerufen wird, die Teil einer Bindung in QML ist, wird die Bindung als Übersetzungsbindung behandelt.
class I18nAwareClass : public QObject { //... QString text() const { if (auto engine = qmlEngine(this)) engine->markCurrentFunctionAsTranslationBinding(); return tr("Hello, world!"); } };
Hinweis: Diese Funktion ist vor allem dann nützlich, wenn Sie eine eigene Alternative zur Funktion qsTr anbieten möchten. Um sicherzustellen, dass Eigenschaften, die von C++-Klassen exponiert werden, bei Sprachänderungen aktualisiert werden, ist es stattdessen empfehlenswert, auf LanguageChange
-Ereignisse zu reagieren. Dies ist ein allgemeinerer Mechanismus, der auch funktioniert, wenn die Klasse in einem Nicht-QML-Kontext verwendet wird, und der etwas weniger Overhead verursacht. Die Verwendung von markCurrentFunctionAsTranslationBinding
kann jedoch akzeptabel sein, wenn die Klasse bereits eng an die QML-Engine gebunden ist. Weitere Details finden Sie unter Vorbereiten auf dynamische Sprachänderungen
Diese Funktion wurde in Qt 6.6 eingeführt.
Siehe auch QQmlEngine::retranslate.
QNetworkAccessManager *QQmlEngine::networkAccessManager() const
Gibt einen gemeinsamen QNetworkAccessManager zurück, der von jedem von dieser Engine instanziierten QML-Typ verwendet werden kann.
Wenn ein QQmlNetworkAccessManagerFactory gesetzt wurde und ein QNetworkAccessManager noch nicht erstellt wurde, wird das QQmlNetworkAccessManagerFactory verwendet, um das QNetworkAccessManager zu erstellen; andernfalls hat das zurückgegebene QNetworkAccessManager keinen Proxy oder Cache gesetzt.
Siehe auch setNetworkAccessManagerFactory().
QQmlNetworkAccessManagerFactory *QQmlEngine::networkAccessManagerFactory() const
Gibt die aktuelle QQmlNetworkAccessManagerFactory zurück.
Siehe auch setNetworkAccessManagerFactory().
QString QQmlEngine::offlineStorageDatabaseFilePath(const QString &databaseName) const
Gibt den Dateipfad zurück, in dem sich eine Datenbank Local Storage mit dem Bezeichner databaseName befindet (oder befinden würde).
Siehe auch LocalStorage.openDatabaseSync().
[signal, since 6.5]
void QQmlEngine::offlineStoragePathChanged()
Dieses Signal wird ausgesendet, wenn sich offlineStoragePath ändert.
Hinweis: Benachrichtigungssignal für die Eigenschaft offlineStoragePath.
Diese Funktion wurde in Qt 6.5 eingeführt.
bool QQmlEngine::outputWarningsToStandardError() const
Gibt true zurück, wenn Warnmeldungen zusätzlich zur Ausgabe durch das Signal warnings() auf stderr ausgegeben werden, andernfalls false.
Der Standardwert ist true.
Siehe auch setOutputWarningsToStandardError().
QStringList QQmlEngine::pluginPathList() const
Gibt die Liste der Verzeichnisse zurück, in denen die Engine nach nativen Plugins für importierte Module (auf die in der Datei qmldir
verwiesen wird) sucht.
Standardmäßig enthält die Liste nur .
, d. h. die Maschine sucht im Verzeichnis der Datei qmldir
selbst.
Siehe auch addPluginPath() und setPluginPathList().
[signal]
void QQmlEngine::quit()
Dieses Signal wird ausgegeben, wenn die von der Engine geladene QML beendet werden soll.
Siehe auch exit().
void QQmlEngine::removeImageProvider(const QString &providerId)
Entfernt den Bildanbieter für providerId.
Siehe auch addImageProvider() und QQuickImageProvider.
void QQmlEngine::removeUrlInterceptor(QQmlAbstractUrlInterceptor *urlInterceptor)
Entfernen Sie eine urlInterceptor, die zuvor mit addUrlInterceptor hinzugefügt wurde. Die URL-Abfangvorrichtungen sollten nicht geändert werden, während die Engine Dateien lädt, da sonst die URL-Auswahl inkonsistent sein könnte.
Dadurch wird der Interceptor nicht gelöscht, sondern lediglich aus der Engine entfernt. Sie können ihn anschließend in derselben oder einer anderen Engine wiederverwenden.
[slot]
void QQmlEngine::retranslate()
Aktualisiert alle Bindungsausdrücke, die zur Übersetzung markierte Zeichenketten verwenden.
Rufen Sie diese Funktion auf, nachdem Sie einen neuen Übersetzer mit QCoreApplication::installTranslator installiert haben, um sicherzustellen, dass Ihre Benutzerschnittstelle aktuelle Übersetzungen anzeigt.
QQmlContext *QQmlEngine::rootContext() const
Gibt den Wurzelkontext der Engine zurück.
Der Wurzelkontext wird automatisch von QQmlEngine erstellt. Daten, die allen von der Engine instanziierten QML-Komponenteninstanzen zur Verfügung stehen sollen, sollten in den Wurzelkontext gestellt werden.
Zusätzliche Daten, die nur einer Teilmenge von Komponenteninstanzen zur Verfügung stehen sollen, sollten in Subkontexten abgelegt werden, die dem Wurzelkontext übergeordnet sind.
void QQmlEngine::setBaseUrl(const QUrl &url)
Setzen Sie die Basis-URL für diese Engine auf url.
Siehe auch baseUrl().
[static]
void QQmlEngine::setContextForObject(QObject *object, QQmlContext *context)
Setzt den QQmlContext für den object auf context. Wenn der object bereits einen Kontext hat, wird eine Warnung ausgegeben, aber der Kontext wird nicht geändert.
Wenn die QQmlEngine eine QObject instanziiert, wird der Kontext automatisch gesetzt.
Siehe auch contextForObject().
void QQmlEngine::setImportPathList(const QStringList &paths)
Legt paths als die Liste der Verzeichnisse fest, in denen die Engine nach installierten Modulen in einer URL-basierten Verzeichnisstruktur sucht.
Standardmäßig enthält diese Liste die unter QML-Importpfad genannten Pfade.
Warnung: Durch den Aufruf von setImportPathList werden die Standard-Importpfade nicht beibehalten.
Siehe auch importPathList() und addImportPath().
void QQmlEngine::setIncubationController(QQmlIncubationController *controller)
Legt die Inkubationszeit des Motors fest controller. Die Engine kann nur ein aktives Steuergerät haben und übernimmt nicht die Verantwortung für dieses.
Siehe auch incubationController().
void QQmlEngine::setNetworkAccessManagerFactory(QQmlNetworkAccessManagerFactory *factory)
Legt die factory für die Erstellung von QNetworkAccessManager(s) fest.
QNetworkAccessManager wird für alle Netzwerkzugriffe von QML verwendet. Durch die Implementierung einer Fabrik ist es möglich, benutzerdefinierte QNetworkAccessManager mit spezieller Caching-, Proxy- und Cookie-Unterstützung zu erstellen.
Die Fabrik muss vor dem Ausführen der Engine gesetzt werden.
Hinweis: QQmlEngine übernimmt nicht die Verantwortung für die Fabrik.
Siehe auch networkAccessManagerFactory().
void QQmlEngine::setOutputWarningsToStandardError(bool enabled)
Legen Sie auf enabled fest, ob Warnmeldungen auf stderr ausgegeben werden sollen.
Wenn enabled wahr ist, werden alle von QML erzeugten Warnmeldungen auf stderr ausgegeben und durch das Signal warnings() ausgegeben. Wenn enabled falsch ist, wird nur das Signal warnings() ausgegeben. Dies ermöglicht es Anwendungen, die Ausgabe von Warnungen selbst zu steuern.
Der Standardwert ist true.
Siehe auch outputWarningsToStandardError().
void QQmlEngine::setPluginPathList(const QStringList &paths)
Setzt die Liste der Verzeichnisse, in denen die Engine nach nativen Plugins für importierte Module (auf die in der Datei qmldir
verwiesen wird) sucht, auf paths.
Standardmäßig enthält die Liste nur .
, d.h. die Engine sucht im Verzeichnis der Datei qmldir
selbst.
Siehe auch pluginPathList() und addPluginPath().
template <typename T> T QQmlEngine::singletonInstance(int qmlTypeId)
Gibt die Instanz eines Singleton-Typs zurück, der unter qmlTypeId registriert wurde.
Das Template-Argument T kann entweder QJSValue oder ein Zeiger auf einen QObject-abgeleiteten Typ sein und hängt davon ab, wie das Singleton registriert wurde. Wenn noch keine Instanz von T erzeugt wurde, wird sie jetzt erzeugt. Wenn qmlTypeId keinen gültigen Singleton-Typ darstellt, wird entweder ein standardmäßig konstruierter QJSValue oder ein nullptr
zurückgegeben.
QObject* Beispiel:
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 Beispiel:
// Register with QJSValue callback int typeId = qmlRegisterSingletonType(...); // Retrieve as QJSValue QQmlEngine engine; QJSValue instance = engine.singletonInstance<QJSValue>(typeId);
Es wird empfohlen, die QML-Typ-ID zu speichern, z.B. als statisches Mitglied in der Singleton-Klasse. Die Suche über qmlTypeId() ist aufwendig.
Siehe auch QML_SINGLETON, qmlRegisterSingletonType(), und qmlTypeId().
[since 6.5]
template <typename T> T QQmlEngine::singletonInstance(QAnyStringView uri, QAnyStringView typeName)
Dies ist eine überladene Funktion.
Gibt die Instanz eines Singleton-Typs namens typeName aus dem durch uri angegebenen Modul zurück.
Diese Methode kann als Alternative zum Aufruf von qmlTypeId gefolgt von der id-basierten Überladung von singletonInstance verwendet werden. Dies ist praktisch, wenn man ein Singleton nur einmal einrichten muss; wenn ein wiederholter Zugriff auf das Singleton erforderlich ist, ermöglicht das Zwischenspeichern seiner typeId einen schnelleren späteren Zugriff über type-id based overload.
Das Template-Argument T kann entweder QJSValue oder ein Zeiger auf einen QObject-abgeleiteten Typ sein und hängt davon ab, wie das Singleton registriert wurde. Wenn noch keine Instanz von T erzeugt wurde, wird sie jetzt erzeugt. Wenn typeName keinen gültigen Singleton-Typ repräsentiert, wird entweder ein standardmäßig konstruierter QJSValue oder ein nullptr
zurückgegeben.
QQmlEngine engine; MySingleton *singleton = engine.singletonInstance<MySingleton *>("mymodule", "MySingleton"); /
Diese Funktion wurde in Qt 6.5 eingeführt.
Siehe auch QML_SINGLETON, qmlRegisterSingletonType(), und qmlTypeId().
void QQmlEngine::trimComponentCache()
Trimmt den internen Komponenten-Cache der Engine.
Diese Funktion bewirkt, dass die Eigenschaftsmetadaten aller geladenen Komponenten, die derzeit nicht in Gebrauch sind, zerstört werden.
Eine Komponente gilt als in Gebrauch, wenn es Instanzen der Komponente selbst, Instanzen anderer Komponenten, die die Komponente verwenden, oder Objekte, die von einer dieser Komponenten instanziiert wurden, gibt.
Siehe auch clearComponentCache().
QList<QQmlAbstractUrlInterceptor *> QQmlEngine::urlInterceptors() const
Gibt die Liste der derzeit aktiven URL-Interceptoren zurück.
[signal]
void QQmlEngine::warnings(const QList<QQmlError> &warnings)
Dieses Signal wird ausgegeben, wenn warnings Nachrichten von QML erzeugt werden.
Verwandte Nicht-Mitglieder
enum QQmlModuleImportSpecialVersions
Definiert einige spezielle Werte, die an die Versionsargumente von qmlRegisterModuleImport() und qmlUnregisterModuleImport() übergeben werden können.
Konstante | Wert | Beschreibung |
---|---|---|
QQmlEngine::QQmlModuleImportModuleAny | -1 | Wird als majorVersion des Basismoduls übergeben, bedeutet dies, dass der Import auf jede Version des Moduls angewendet werden soll. |
QQmlEngine::QQmlModuleImportLatest | -1 | Bei Übergabe als Major- oder Minor-Version des importierten Moduls bedeutet dies, dass die neueste Gesamt- oder die neueste Minor-Version einer angegebenen Major-Version importiert werden soll. |
QQmlEngine::QQmlModuleImportAuto | -2 | Wird als Hauptversion des importierten Moduls übergeben, bedeutet dies, dass die Version des Basismoduls weitergegeben werden soll. |
template <typename T> QObject *qmlAttachedPropertiesObject(const QObject *attachee, bool create = true)
Die Form dieser Vorlagenfunktion ist:
template<typename T> QObject *qmlAttachedPropertiesObject(const QObject *attachee, bool create = true)
Sie gibt die angehängte Objektinstanz zurück, die an die angegebene attachee durch den anhängenden Typ T angehängt wurde.
Wenn create wahr ist und Typ T ein gültiger anhängender Typ ist, wird eine neue angehängte Objektinstanz erstellt und zurückgegeben.
Gibt nullptr
zurück, wenn Typ T kein gültiger anhängender Typ ist, oder wenn create falsch ist und zuvor keine angehängte Objektinstanz für attachee erstellt wurde.
Siehe auch QML_ATTACHED() und Providing Attached Properties.
void qmlClearTypeRegistrations()
Löscht alle gespeicherten Typregistrierungen, wie die mit qmlRegisterType() erzeugten.
Rufen Sie diese Funktion nicht auf, solange eine QQmlEngine existiert, sonst ist das Verhalten undefiniert. Alle vorhandenen QQmlEngines müssen vor dem Aufruf dieser Funktion gelöscht werden. Diese Funktion betrifft nur den globalen Cache der Anwendung. Löschen Sie die QQmlEngine, um alle gecachten Daten zu löschen, die sich auf diese Engine beziehen.
QQmlContext *qmlContext(const QObject *object)
Gibt die QQmlContext zurück, die mit object verbunden ist, falls vorhanden. Dies ist gleichbedeutend mit QQmlEngine::contextForObject(Objekt).
Hinweis: Fügen Sie #include <QtQml>
hinzu, um diese Funktion zu verwenden.
Siehe auch contextForObject() und qmlEngine().
QQmlEngine *qmlEngine(const QObject *object)
Gibt die QQmlEngine zurück, die mit object verbunden ist, falls vorhanden. Dies entspricht QQmlEngine::contextForObject(Objekt)->engine(), ist aber effizienter.
Hinweis: Fügen Sie #include <QtQml>
hinzu, um diese Funktion zu verwenden.
Siehe auch contextForObject() und qmlContext().
bool qmlProtectModule(const char *uri, int majVersion)
Diese Funktion schützt ein Modul vor weiteren Änderungen. Dies kann verwendet werden, um zu verhindern, dass andere Plugins Typen in Ihr Modul injizieren. Es kann auch eine Leistungsverbesserung sein, da es der Engine erlaubt, die Überprüfung auf die Möglichkeit neuer Typen oder Plugins zu überspringen, wenn dieser Import erreicht ist.
Sobald qmlProtectModule aufgerufen wurde, wird eine QML-Engine nicht mehr nach einer neuen qmldir
Datei suchen, um das Modul zu laden. Sie wird jedoch alle qmldir
Dateien, die sie zuvor geladen hat, wiederverwenden. Daher funktionieren Typen, die zu diesem Zeitpunkt vorhanden sind, weiterhin. Beachten Sie, dass verschiedene QML-Engines unterschiedliche Module laden können. Der Modulschutz ist jedoch global und betrifft alle Engines. Der Overhead beim Auffinden von qmldir
Dateien und beim Laden von Plugins kann sich bei langsamen Dateisystemen bemerkbar machen. Daher kann es eine gute Optimierung sein, ein Modul zu schützen, wenn Sie sicher sind, dass Sie es nicht mehr laden müssen. Beachten Sie auch, dass die Modulsperre nicht nur Plugins betrifft, sondern auch alle anderen qmldir-Direktiven, wie import
oder prefer
, sowie alle zusammengesetzten Typen oder Skripte, die in einer qmldir
Datei deklariert sind.
Darüber hinaus führt nach dem Aufruf dieser Funktion jeder Versuch, C++-Typen in dieser Kombination aus uri und Hauptversion zu registrieren, zu einem Laufzeitfehler.
Gibt true zurück, wenn das Modul mit uri als Modulbezeichner und majVersion als Hauptversionsnummer gefunden und gesperrt wurde; andernfalls wird false zurückgegeben. Das Modul muss exportierte Typen enthalten, um gefunden zu werden.
template <typename T> int qmlRegisterAnonymousType(const char *uri, int versionMajor)
Diese Vorlagenfunktion registriert den C++-Typ im QML-System als anonymen Typ. Der resultierende QML-Typ hat keinen Namen. Daher können Instanzen dieses Typs nicht über das QML-System erstellt werden. Sie können jedoch auf Instanzen des Typs zugreifen, wenn sie als Eigenschaften anderer Typen exponiert sind.
Verwenden Sie diese Funktion, wenn der Typ nicht über den Namen referenziert wird, insbesondere für C++-Typen, die auf der linken Seite einer Eigenschaftsbindung verwendet werden. Um anzugeben, zu welchem Modul der Typ gehört, verwenden Sie uri und versionMajor.
Betrachten wir zum Beispiel die folgenden zwei Klassen:
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; };
In QML weisen wir der Eigenschaft baz
von bar
einen String zu:
Foo { bar.baz: "abc" Component.onCompleted: print(bar.baz) }
Damit die QML-Engine weiß, dass der Typ Bar
eine Eigenschaft baz
hat, müssen wir Bar
bekannt machen:
qmlRegisterType<Foo>("App", 1, 0, "Foo"); qmlRegisterAnonymousType<Bar>("App", 1);
Da der Typ Foo
in QML instanziiert wird, muss er mit der Version von qmlRegisterType() registriert werden, die einen Elementnamen annimmt.
Gibt die QML-Typ-ID zurück.
Siehe auch QML_ANONYMOUS und Auswahl der korrekten Integrationsmethode zwischen C++ und QML.
template <typename T, typename E> int qmlRegisterExtendedType(const char *uri, int versionMajor, int versionMinor, const char *qmlName)
Diese Vorlagenfunktion registriert den C++-Typ und sein Erweiterungsobjekt im QML-System mit dem Namen qmlName in der von uri importierten Bibliothek mit einer aus versionMajor und versionMinor zusammengesetzten Versionsnummer. Eigenschaften, die im Haupttyp nicht verfügbar sind, werden im Erweiterungsobjekt gesucht.
Gibt die QML-Typ-ID zurück.
Siehe auch QML_EXTENDED(), qmlRegisterType(), und Registrierung von Erweiterungsobjekten.
template <typename T, typename E> int qmlRegisterExtendedUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason)
Diese Vorlagenfunktion registriert den C++-Typ und seine Erweiterung im QML-System mit dem Namen qmlName in der von uri importierten Bibliothek mit einer aus versionMajor und versionMinor zusammengesetzten Versionsnummer.
Solange der Typ einen Namen und einen Typ hat, kann er nicht erstellt werden. Wenn der Benutzer versucht, eine Instanz dieses Typs zu erstellen, wird eine Fehlermeldung mit dem angegebenen reason ausgegeben.
Dies ist nützlich, wenn der Typ nur für die Bereitstellung von angehängten Eigenschaften, Enum-Werten oder einer abstrakten Basisklasse mit ihrer Erweiterung gedacht ist.
Gibt die QML-Typ-ID zurück.
Siehe auch QML_EXTENDED(), QML_UNCREATABLE(), und qmlRegisterUncreatableType().
void qmlRegisterModule(const char *uri, int versionMajor, int versionMinor)
Diese Funktion registriert ein Modul in einem bestimmten uri mit einer in versionMajor und versionMinor angegebenen Version.
Auf diese Weise kann eine bestimmte Modulversion verfügbar gemacht werden, auch wenn keine Typen für diese Version registriert sind. Dies ist besonders nützlich, um die Versionen von verwandten Modulen synchron zu halten.
void qmlRegisterModuleImport(const char *uri, int moduleMajor, const char *import, int importMajor = QQmlModuleImportLatest, int importMinor = QQmlModuleImportLatest)
Registriert einen qmldir-Import für das Modul uri der Hauptversion moduleMajor.
Dies hat die gleiche Wirkung wie eine import
-Anweisung in einer qmldir-Datei: Immer wenn uri der Version moduleMajor importiert wird, wird import der Version importMajor. importMinor automatisch mit importiert. Wenn importMajor QQmlModuleImportLatest ist, wird die letzte verfügbare Version dieses Moduls importiert, und importMinor spielt keine Rolle. Wenn importMinor QQmlModuleImportLatest ist, wird die letzte Nebenversion von importMajor gewählt. Wenn importMajor QQmlModuleImportAuto ist, ist die Version von import die Version von uri, die importiert wird, und importMinor spielt keine Rolle. Wenn moduleMajor gleich QQmlModuleImportModuleAny ist, wird der Modulimport auf jede Hauptversion von uri angewendet. Sie können zum Beispiel angeben, dass immer dann, wenn eine Version von MyModule importiert wird, die neueste Version von MyOtherModule importiert werden soll. Dann wäre der folgende Aufruf angemessen:
qmlRegisterModuleImport("MyModule", QQmlModuleImportModuleAny, "MyOtherModule", QQmlModuleImportLatest);
Oder Sie können festlegen, dass immer dann, wenn die Hauptversion 5 von "MyModule" importiert wird, die Version 3.14 von "MyOtherModule" importiert werden soll:
qmlRegisterModuleImport("MyModule", 5, "MyOtherModule", 3, 14);
Wenn Sie schließlich wollen, dass immer dieselbe Version von "MyOtherModule" importiert wird, wenn "MyModule" importiert wird, geben Sie Folgendes an:
qmlRegisterModuleImport("MyModule", QQmlModuleImportModuleAny, "MyOtherModule", QQmlModuleImportAuto);
Siehe auch qmlUnregisterModuleImport().
template <typename T, int metaObjectRevision> int qmlRegisterRevision(const char *uri, int versionMajor, int versionMinor)
Diese Template-Funktion registriert die angegebene Revision eines C++-Typs im QML-System mit der von uri importierten Bibliothek, deren Versionsnummer sich aus versionMajor und versionMinor zusammensetzt.
Gibt die QML-Typ-ID zurück.
template<typename T, int metaObjectRevision> int qmlRegisterRevision(const char *uri, int versionMajor, int versionMinor);
Diese Funktion wird typischerweise verwendet, um die Revision einer Basisklasse zu registrieren, die für die angegebene Version des Typs verwendet werden soll (siehe Typrevisionen und -versionen).
int qmlRegisterSingletonInstance(const char *uri, int versionMajor, int versionMinor, const char *typeName, QObject *cppObject)
Diese Funktion wird verwendet, um ein Singleton-Objekt cppObject mit einem bestimmten uri und typeName zu registrieren. Seine Version ist eine Kombination aus versionMajor und versionMinor.
Die Installation eines Singleton-Typs in einer URI ermöglicht es Ihnen, QML-Code beliebige Funktionalität (Methoden und Eigenschaften) zur Verfügung zu stellen, ohne dass einzelne Instanzen des Typs vom Client instanziiert werden müssen.
Verwenden Sie diese Funktion, um ein Objekt des angegebenen Typs T als Singleton-Typ zu registrieren.
Ein QObject Singleton-Typ kann über den Typnamen, mit dem er registriert wurde, referenziert werden; dieser Typname kann wiederum als Ziel in einem Connections -Typ oder wie jede andere Typ-ID verwendet werden. Es gibt jedoch eine Ausnahme: eine QObject Singleton-Typ-Eigenschaft kann nicht aliasiert werden, da der Singleton-Typ-Name kein Objekt innerhalb der gleichen Komponente identifiziert wie jedes andere Element.
Hinweis: cppObject muss die QML-Engine, in der es verwendet wird, überdauern. Außerdem muss cppObject die gleiche Thread-Affinität haben wie die Engine. Wenn Sie separate Singleton-Instanzen für mehrere Engines wollen, müssen Sie qmlRegisterSingletonType verwenden. Siehe Threads und QObjects für weitere Informationen über Threadsicherheit.
HINWEIS: qmlRegisterSingleton kann nur verwendet werden, wenn alle Typen dieses Moduls prozedural registriert sind.
Verwendung:
// 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());
Um den registrierten Singleton-Typ in QML zu verwenden, müssen Sie die URI mit der entsprechenden Version importieren.
import QtQuick 2.0 import Qt.example.qobjectSingleton 1.0 Item { id: root property int someValue: MyApi.someProperty Component.onCompleted: { console.log(MyApi.doSomething()) } }
Siehe auch QML_SINGLETON und qmlRegisterSingletonType.
int qmlRegisterSingletonType(const QUrl &url, const char *uri, int versionMajor, int versionMinor, const char *qmlName)
Diese Funktion kann verwendet werden, um einen Singleton-Typ mit dem Namen qmlName in der von uri importierten Bibliothek mit der aus versionMajor und versionMinor zusammengesetzten Versionsnummer zu registrieren. Der Typ wird durch die QML-Datei definiert, die sich unter url befindet. Die url muss eine absolute URL sein, d. h. url.isRelative() == false.
Außerdem muss die QML-Datei des Typs in ihren Import-Anweisungen die Anweisung pragma Singleton enthalten.
Ein Singleton-Typ kann über den Typnamen referenziert werden, mit dem er registriert wurde, und dieser Typname kann als Ziel in einem Connections -Typ oder auf andere Weise wie jede andere Typ-ID verwendet werden. Eine Ausnahme hiervon ist, dass eine Eigenschaft eines Singleton-Typs nicht aliasiert werden darf (weil der Name des Singleton-Typs ein Objekt innerhalb derselben Komponente nicht mit einem anderen Element identifiziert).
Verwendung:
// 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");
Um den registrierten Singleton-Typ in QML verwenden zu können, müssen Sie den Singleton-Typ importieren.
import QtQuick 2.0 import Qt.example.qobjectSingleton 1.0 Item { id: root property int someValue: RegisteredSingleton.testProp1 }
Es ist auch möglich, QML-Singleton-Typen registrieren zu lassen, ohne die Funktion qmlRegisterSingletonType zu verwenden. Dies kann durch Hinzufügen einer pragma Singleton-Anweisung zu den Importen der QML-Datei des Typs geschehen. Zusätzlich muss der Typ in einer qmldir-Datei mit einem Singleton-Schlüsselwort definiert sein und die qmldir-Datei muss von den QML-Dateien, die das Singleton verwenden, importiert werden.
Siehe auch QML_SINGLETON.
int qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, std::function<QJSValue (QQmlEngine *, QJSEngine *)> callback)
Diese Funktion kann verwendet werden, um einen Singleton-Typ-Anbieter callback in einer bestimmten uri und typeName mit einer in versionMajor und versionMinor angegebenen Version zu registrieren.
Die Installation eines Singleton-Typs ermöglicht es Entwicklern, einem Client beliebige Funktionalität (Methoden und Eigenschaften) zur Verfügung zu stellen, ohne dass einzelne Instanzen des Typs vom Client instanziiert werden müssen.
Ein Singleton-Typ kann entweder ein QObject oder ein QJSValue sein. Diese Funktion sollte verwendet werden, um eine Singleton-Typ-Anbieterfunktion zu registrieren, die einen QJSValue als Singleton-Typ zurückgibt.
HINWEIS: QJSValue Singleton-Typ-Eigenschaften lösen bei Änderung keine erneute Bindungsevaluierung aus.
Verwendung:
// 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);
Alternativ können Sie auch ein C++11-Lambda verwenden:
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; });
Um den registrierten Singleton-Typ in QML verwenden zu können, müssen Sie den Singleton-Typ importieren.
import QtQuick 2.0 import Qt.example.qjsvalueApi 1.0 as ExampleApi Item { id: root property int someValue: ExampleApi.MyApi.someProperty }
Siehe auch QML_SINGLETON und Auswahl der korrekten Integrationsmethode zwischen C++ und QML.
template <typename T> int qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, std::function<QObject *(QQmlEngine *, QJSEngine *)> callback)
Diese Funktion kann verwendet werden, um einen Singleton-Typ-Anbieter callback in einer bestimmten uri und typeName mit einer in versionMajor und versionMinor angegebenen Version zu registrieren.
Die Installation eines Singleton-Typs in einer Uri ermöglicht es Entwicklern, beliebige Funktionalität (Methoden und Eigenschaften) für Clients bereitzustellen, ohne dass einzelne Instanzen des Typs vom Client instanziiert werden müssen.
Ein Singleton-Typ kann entweder ein QObject oder ein QJSValue sein. Diese Funktion sollte verwendet werden, um eine Singleton-Typ-Provider-Funktion zu registrieren, die ein QObject des gegebenen Typs T als Singleton-Typ zurückgibt.
Ein QObject Singleton-Typ kann über den Typnamen referenziert werden, mit dem er registriert wurde, und dieser Typname kann als Ziel in einem Connections -Typ oder auf andere Weise wie jede andere Typ-ID verwendet werden. Eine Ausnahme hiervon ist, dass eine QObject singleton type Eigenschaft nicht aliasiert werden darf.
HINWEIS: Eine QObject Singleton-Typ-Instanz, die von einem Singleton-Typ-Anbieter zurückgegeben wird, gehört der QML-Engine, es sei denn, das Objekt hat ein explizites QQmlEngine::CppOwnership-Flag gesetzt.
Verwendung:
// 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);
Alternativ können Sie auch ein C++11-Lambda verwenden:
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; });
Um den registrierten Singleton-Typ in QML verwenden zu können, müssen Sie den Singleton-Typ importieren.
import QtQuick 2.0 import Qt.example.qobjectSingleton 1.0 Item { id: root property int someValue: MyApi.someProperty Component.onCompleted: { someValue = MyApi.doSomething() } }
Siehe auch QML_SINGLETON und Auswahl der korrekten Integrationsmethode zwischen C++ und QML.
template <typename T> int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName)
Diese Template-Funktion registriert den C++-Typ im QML-System mit dem Namen qmlName, in der von uri importierten Bibliothek mit der Versionsnummer, die sich aus versionMajor und versionMinor zusammensetzt.
Gibt die QML-Typ-ID zurück.
Es gibt zwei Formen dieser Vorlagenfunktion:
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);
Die erste ist die Standardform, die den Typ T als neuen Typ registriert. Mit der zweiten Form kann eine bestimmte Revision einer Klasse in einer bestimmten Version registriert werden (siehe Typrevisionen und Versionen).
So wird beispielsweise eine C++-Klasse MySliderItem
als QML-Typ mit dem Namen Slider
für Version 1.0 eines Typ-Namensraums namens "com.mycompany.qmlcomponents" registriert:
qmlRegisterType<MySliderItem>("com.mycompany.qmlcomponents", 1, 0, "Slider");
Sobald dies registriert ist, kann der Typ in QML verwendet werden, indem der angegebene Typnamensraum und die Versionsnummer importiert werden:
import com.mycompany.qmlcomponents 1.0 Slider { // ... }
Beachten Sie, dass es durchaus möglich ist, dass eine Bibliothek Typen für ältere Versionen als die aktuelle Version der Bibliothek registriert. In der Tat ist es normal, dass die neue Bibliothek QML, das für frühere Versionen geschrieben wurde, weiterhin funktionieren lässt, selbst wenn fortgeschrittenere Versionen einiger ihrer Typen verfügbar sind.
Siehe auch QML_ELEMENT, QML_NAMED_ELEMENT(), und Auswahl der richtigen Integrationsmethode zwischen C++ und QML.
int qmlRegisterType(const QUrl &url, const char *uri, int versionMajor, int versionMinor, const char *qmlName)
Diese Funktion registriert einen Typ im QML-System mit dem Namen qmlName, in der von uri importierten Bibliothek mit der aus versionMajor und versionMinor zusammengesetzten Versionsnummer. Der Typ wird durch die QML-Datei definiert, die sich unter url befindet. Die url muss eine absolute URL sein, d.h. url.isRelative() == false.
Normalerweise können QML-Dateien als Typen direkt aus anderen QML-Dateien oder über eine qmldir-Datei geladen werden. Diese Funktion ermöglicht die Registrierung von Dateien zu Typen aus C++-Code, z. B. wenn die Typzuordnung beim Start prozedural bestimmt werden muss.
Gibt -1 zurück, wenn die Registrierung nicht erfolgreich war.
int qmlRegisterTypeNotAvailable(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &message)
Diese Funktion registriert einen Typ im QML-System mit dem Namen qmlName, im Typ-Namensraum, der von uri importiert wurde und die Versionsnummer hat, die sich aus versionMajor und versionMinor zusammensetzt, aber jeder Versuch, den Typ zu instanziieren, führt zu dem angegebenen Fehler message.
Normalerweise sollten die von einem Plugin exportierten Typen fest sein. Wenn jedoch ein C++-Typ nicht verfügbar ist, sollten Sie zumindest den QML-Typnamen "reservieren" und dem Benutzer des nicht verfügbaren Typs eine sinnvolle Fehlermeldung geben.
Gibt die QML-Typ-ID zurück.
Beispiel:
#ifdef NO_GAMES_ALLOWED qmlRegisterTypeNotAvailable("MinehuntCore", 0, 1, "Game", "Get back to work, slacker!"); #else qmlRegisterType<MinehuntGame>("MinehuntCore", 0, 1, "Game"); #endif
Dies führt dazu, dass jede QML, die den "MinehuntCore"-Typ-Namensraum importiert und versucht, den Typ zu verwenden, eine Fehlermeldung erzeugt:
fun.qml: Get back to work, slacker! Game { ^
Ohne dies würde eine allgemeine "Game is not a type"-Meldung ausgegeben werden.
Siehe auch QML_UNAVAILABLE, qmlRegisterUncreatableType(), und Auswahl der richtigen Integrationsmethode zwischen C++ und QML.
int qmlRegisterUncreatableMetaObject(const QMetaObject &staticMetaObject, const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason)
Diese Funktion registriert die staticMetaObject und ihre Erweiterung im QML-System mit dem Namen qmlName in der von uri importierten Bibliothek mit der Versionsnummer, die sich aus versionMajor und versionMinor zusammensetzt.
Eine Instanz des Meta-Objekts kann nicht erstellt werden. Eine Fehlermeldung mit dem angegebenen reason wird ausgegeben, wenn der Benutzer versucht, es zu erstellen.
Diese Funktion ist nützlich für die Registrierung von Q_NAMESPACE Namespaces.
Gibt die QML-Typ-ID zurück.
Zum Beispiel:
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");
Auf der QML-Seite können Sie nun die registrierten Enums verwenden:
Component.onCompleted: console.log(MyNamespace.Key2)
Siehe auch QML_ELEMENT, QML_NAMED_ELEMENT(), und QML_UNCREATABLE().
template <typename T> int qmlRegisterUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &message)
Diese Vorlagenfunktion registriert den C++-Typ im QML-System mit dem Namen qmlName in der von uri importierten Bibliothek mit der Versionsnummer, die sich aus versionMajor und versionMinor zusammensetzt.
Der Typ hat zwar einen Namen und einen Typ, kann aber nicht erstellt werden, und der angegebene Fehler message wird ausgegeben, wenn versucht wird, ihn zu erstellen.
Dies ist nützlich, wenn der Typ nur dazu gedacht ist, angehängte Eigenschaften oder Enum-Werte bereitzustellen.
Gibt die QML-Typ-ID zurück.
Siehe auch QML_UNCREATABLE(), qmlRegisterTypeNotAvailable(), und Auswahl der richtigen Integrationsmethode zwischen C++ und QML.
int qmlTypeId(const char *uri, int versionMajor, int versionMinor, const char *qmlName)
Gibt die QML-Typ-ID eines Typs zurück, der mit dem Namen qmlName in einem bestimmten uri und einer in versionMajor und versionMinor angegebenen Version registriert wurde.
Diese Funktion gibt denselben Wert zurück wie die QML-Typenregistrierungsfunktionen wie qmlRegisterType() und qmlRegisterSingletonType().
Wenn qmlName, uri und versionMajor mit einem registrierten Typ übereinstimmen, aber die in versionMinor angegebene Minor-Version höher ist, dann wird die ID des Typs mit der nächstliegenden Minor-Version zurückgegeben.
Gibt -1 zurück, wenn kein passender Typ gefunden wurde oder einer der angegebenen Parameter ungültig war.
Hinweis: : qmlTypeId versucht, Module verfügbar zu machen, auch wenn noch keine Engine auf sie zugegriffen hat. Dies kann beim ersten Zugriff auf ein Modul zu Overhead führen. Der Versuch, Typen aus einem Modul zu finden, das nicht existiert, führt immer zu diesem Overhead.
Siehe auch QML_ELEMENT, QML_NAMED_ELEMENT, QML_SINGLETON, qmlRegisterType(), und qmlRegisterSingletonType().
void qmlUnregisterModuleImport(const char *uri, int moduleMajor, const char *import, int importMajor = QQmlModuleImportLatest, int importMinor = QQmlModuleImportLatest)
Entfernt einen zuvor mit qmlRegisterModuleImport() registrierten Modulimport.
Der Aufruf dieser Funktion stellt sicher, dass import der Version importMajor.importMinor nicht mehr automatisch importiert wird, wenn uri der Version moduleMajor importiert wird. Die Versionsauflösung funktioniert auf die gleiche Weise wie bei qmlRegisterModuleImport().
Siehe auch qmlRegisterModuleImport().
Makro-Dokumentation
QML_ADDED_IN_VERSION(MAJOR, MINOR)
Deklariert, dass der umschließende Typ oder Namespace in der angegebenen MAJOR.MINOR Version hinzugefügt wurde. Es wird angenommen, dass die Version mit allen Revisionen übereinstimmt, die durch Q_REVISION()-Makros für Methoden, Slots oder Signale und durch REVISION()-Attribute für mit Q_PROPERTY() deklarierte Eigenschaften angegeben wurden.
QML_ADDED_IN_VERSION() wird nur wirksam, wenn der Typ oder Namespace in QML verfügbar ist, indem er ein QML_ELEMENT, QML_NAMED_ELEMENT(), QML_ANONYMOUS oder QML_INTERFACE Makro hat.
Wenn das QML-Modul, zu dem der Typ gehört, mit einer niedrigeren Version als der auf diese Weise ermittelten importiert wird, ist der QML-Typ unsichtbar.
Siehe auch QML_ELEMENT und QML_NAMED_ELEMENT.
QML_ANONYMOUS
Deklariert den umschließenden Typ als verfügbar, aber anonym in QML. Der Typ kann nicht erstellt oder zur Deklaration von Eigenschaften in QML verwendet werden, wird aber bei der Übergabe aus C++ erkannt. In QML können Sie Eigenschaften dieses Typs verwenden, wenn sie in C++ deklariert sind.
Siehe auch QML_ELEMENT, QML_NAMED_ELEMENT(), QML_UNCREATABLE(), und QML_INTERFACE.
QML_ATTACHED(ATTACHED_TYPE)
Deklariert, dass der umschließende Typ ATTACHED_TYPE als angehängte Eigenschaft an andere Typen anhängt. Dies wird wirksam, wenn der Typ mit einem QML_ELEMENT oder QML_NAMED_ELEMENT() Makro in QML exponiert ist.
Hinweis: Der Klassenname muss voll qualifiziert sein, auch wenn Sie sich bereits innerhalb des Namespaces befinden.
Siehe auch QML_ELEMENT, QML_NAMED_ELEMENT(), qmlAttachedPropertiesObject(), und Bereitstellen von angehängten Eigenschaften.
[since 6.5]
QML_CONSTRUCTIBLE_VALUE
Markiert den umgebenden Werttyp als konstruierbar. Das heißt, alle Q_INVOKABLE Konstruktoren des Typs, die genau ein Argument annehmen, können verwendet werden, wenn einer Eigenschaft dieses Typs ein JavaScript-Wert zugewiesen wird.
Sie können einen konstruierbaren Wertetyp wie folgt deklarieren:
class MyValueType { Q_GADGET QML_VALUE_TYPE(myValueType) QML_CONSTRUCTIBLE_VALUE public: Q_INVOKABLE MyValueType(double d); // ... };
Mit dem obigen Typ erzeugt der folgende QML-Code einen MyValueType
Wert unter Verwendung des angegebenen Konstruktors und weist ihn der Eigenschaft zu.
QtObject { property myValueType v: 5.4 }
Sie können auch Listen von Werten auf diese Weise konstruieren:
QtObject { property list<myValueType> v: [5.4, 4.5, 3.3] }
Wenn Sie Wertetypen adressierbar machen, können Sie einen solchen Typ in einer Type Assertion verwenden, um ihn explizit zu konstruieren:
pragma ValueTypeBehavior: Addressable QtObject { function process(d: real) { let v = d as myValueType; // v is a myValueType now, not a number } }
Dieses Makro wurde in Qt 6.5 eingeführt.
Siehe auch QML_VALUE_TYPE.
QML_DECLARE_TYPE
Äquivalent zu Q_DECLARE_METATYPE(TYPE *)
und Q_DECLARE_METATYPE(QQmlListProperty<TYPE>)
QML_DECLARE_TYPEINFO(Type, Flags)
Deklariert zusätzliche Eigenschaften des gegebenen Type wie durch die angegebene Flags beschrieben.
Derzeit ist die einzige unterstützte Typinformation QML_HAS_ATTACHED_PROPERTIES
, die angibt, dass Type angehängte Eigenschaften unterstützt. QML_DECLARE_TYPEINFO() ist nicht notwendig, wenn Type das Makro QML_ATTACHED enthält.
QML_ELEMENT
Deklariert den umschließenden Typ oder Namespace als in QML verfügbar, wobei sein Klassen- oder Namespace-Name als QML-Elementname verwendet wird.
Dadurch wird beispielsweise die C++-Klasse Slider
als QML-Typ mit dem Namen Slider
verfügbar. Alle ihre Eigenschaften, aufrufbaren Methoden und Enums sind verfügbar.
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); // ... }
Sie können das Build-System verwenden, um den Typ im Typ-Namensraum com.mycompany.qmlcomponents mit der Hauptversion 1
zu registrieren. Für qmake geben Sie folgendes in Ihrer Projektdatei an:
CONFIG += qmltypes QML_IMPORT_NAME = com.mycompany.qmlcomponents QML_IMPORT_MAJOR_VERSION = 1
Mit CMake übergeben Sie den URI und die Version an qt_add_qml_module
qt6_add_qml_module(myapp URI com.mycompany.qmlcomponents VERSION 1.0 )
Sobald der Typ registriert ist, kann er in QML verwendet werden, indem man den gleichen Typ-Namensraum und die gleiche Versionsnummer importiert:
import com.mycompany.qmlcomponents 1.0 Slider { value: 12 Component.onCompleted: slide(Slider.Icy) // ... }
Sie können auf diese Weise auch Namespaces, die mit Q_NAMESPACE gekennzeichnet sind, verfügbar machen, um alle Enums, die mit Q_ENUM_NS gekennzeichnet sind, offenzulegen:
namespace MyNamespace { Q_NAMESPACE QML_ELEMENT enum MyEnum { Key1, Key2, }; Q_ENUM_NS(MyEnum) }
In QML können Sie dann die Enums verwenden:
Component.onCompleted: console.log(MyNamespace.Key2)
HINWEIS: Wenn Klassen den gleichen Namen haben, aber in verschiedenen Namespaces liegen, führt die Verwendung von QML_ELEMENT für beide zu einem Konflikt. Stellen Sie sicher, dass Sie stattdessen QML_NAMED_ELEMENT() für eine der beiden Klassen verwenden.
Hinweis: Der Klassenname muss voll qualifiziert sein, auch wenn Sie sich bereits innerhalb des Namespaces befinden.
Siehe auch Auswahl der korrekten Integrationsmethode zwischen C++ und QML, QML_NAMED_ELEMENT(), Q_REVISION() und QML_ADDED_IN_VERSION().
QML_EXTENDED(EXTENDED_TYPE)
Deklariert, dass der umschließende Typ EXTENDED_TYPE als Erweiterung verwendet, um weitere Eigenschaften, Methoden und Aufzählungen in QML bereitzustellen. Dies wird wirksam, wenn der Typ in QML mit einem QML_ELEMENT oder QML_NAMED_ELEMENT() Makro dargestellt wird.
Warnung: Die Mitglieder von EXTENDED_TYPE werden implizit als FINAL behandelt.
Hinweis: Der Klassenname muss voll qualifiziert sein, auch wenn Sie sich bereits innerhalb des Namespaces befinden.
Siehe auch QML_ELEMENT, QML_NAMED_ELEMENT(), QML_EXTENDED_NAMESPACE(), und Registrierung von Erweiterungsobjekten.
QML_EXTENDED_NAMESPACE(EXTENDED_NAMESPACE)
Deklariert, dass der umschließende Typ EXTENDED_NAMESPACE als Erweiterung verwendet, um weitere Aufzählungen in QML bereitzustellen. Dies wird wirksam, wenn der Typ in QML mit einem QML_ELEMENT oder QML_NAMED_ELEMENT() Makro dargestellt wird. Damit dies funktioniert, müssen die Aufzählungen dem Metaobjektsystem ausgesetzt sein.
Nehmen wir zum Beispiel den folgenden C++-Code
namespace MyNamespace { Q_NAMESPACE enum MyEnum { MyEnumerator = 10 }; Q_ENUM_NS(MyEnum) } class QmlType : public QObject { Q_OBJECT QML_ELEMENT QML_EXTENDED_NAMESPACE(MyNamespace) }
können wir auf die Aufzählung in QML zugreifen:
QmlType { property int i: QmlType.MyEnumerator // i will be 10 }
Hinweis: EXTENDED_NAMESPACE kann auch ein QObject oder QGadget sein; in diesem Fall - und im Gegensatz zu QML_EXTENDED, das auch Methoden und Eigenschaften offenlegt - werden nur seine Aufzählungen offengelegt.
Hinweis: EXTENDED_NAMESPACE muss ein Metaobjekt haben, d.h. es muss entweder ein Namespace sein, der das Makro Q_NAMESPACE enthält oder ein QObject/QGadget.
Hinweis: Der Klassenname muss voll qualifiziert sein, auch wenn Sie sich bereits innerhalb des Namespaces befinden.
Siehe auch QML_ELEMENT, QML_NAMED_ELEMENT(), QML_EXTENDED(), Registrierung von Erweiterungsobjekten, Q_ENUM, und Q_ENUM_NS.
QML_EXTRA_VERSION(MAJOR, MINOR)
Geben Sie an, dass der Typ auch in der Version MAJOR verfügbar sein soll.MINOR. Dies kann hilfreich sein, wenn ein Typ in mehreren Hauptversionen verfügbar sein soll.
Typen werden automatisch registriert für:
- Die Hauptversion, in der sie eingeführt wurden, siehe QML_ADDED_IN_VERSION.
- Alle Hauptversionen, in denen ihre Mitglieder eingeführt wurden.
- Die aktuelle Hauptversion ihres Moduls, es sei denn, sie waren vorher QML_REMOVED_IN_VERSION.
Insbesondere werden sie nicht automatisch in allen PAST_MAJOR_VERSIONS zwischen den oben genannten registriert. Sie können QML_EXTRA_VERSION verwenden, um Ihre Typen manuell in weiteren Hauptversionen zu registrieren.
Hinweis: Die Beibehaltung mehrerer PAST_MAJOR_VERSIONS ist rechenintensiv.
Siehe auch QML_ELEMENT und QML_ADDED_IN_VERSION.
QML_FOREIGN(FOREIGN_TYPE)
Deklariert, dass alle 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() oder QML_EXTENDED_NAMESPACE() Makros im umschließenden C++-Typ nicht für den umschließenden Typ, sondern für FOREIGN_TYPE gelten. Der umschließende Typ muss weiterhin mit einem Q_GADGET oder Q_OBJECT Makro im Meta-Objektsystem registriert werden.
Dies ist nützlich für die Registrierung von Typen, die nicht geändert werden können, um die Makros hinzuzufügen, zum Beispiel weil sie zu Bibliotheken von Drittanbietern gehören. Um einen Namespace zu registrieren, siehe QML_FOREIGN_NAMESPACE().
Hinweis: Möglicherweise möchten Sie QML_NAMED_ELEMENT() anstelle von QML_ELEMENT verwenden. Mit QML_ELEMENT wird das Element nach der Struktur benannt, in der es enthalten ist, nicht nach dem fremden Typ. Das Kapitel Integration fremder Objekte in Writing advanced QML Extensions with C++ demonstriert dies.
Hinweis: QML_ATTACHED() kann derzeit nicht auf diese Weise umgelenkt werden. Sie muss in demselben Typ spezifiziert werden, der qmlAttachedProperties() implementiert.
Hinweis: Der Klassenname muss voll qualifiziert sein, auch wenn Sie sich bereits innerhalb des Namespaces befinden.
Siehe auch QML_ELEMENT, QML_NAMED_ELEMENT(), und QML_FOREIGN_NAMESPACE().
QML_FOREIGN_NAMESPACE(FOREIGN_NAMESPACE)
Deklariert, dass alle 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() oder QML_REMOVED_IN_MINOR_VERSION() Makros im umschließenden C++-Namensraum nicht für den umschließenden Typ, sondern für FOREIGN_NAMESPACE gelten. Der umschließende Namensraum muss weiterhin mit einem Q_NAMESPACE -Makro im Meta-Objektsystem registriert werden.
Dies ist nützlich für die Registrierung von Namespaces, die nicht geändert werden können, um die Makros hinzuzufügen, z. B. weil sie zu Bibliotheken von Drittanbietern gehören.
Siehe auch QML_ELEMENT, QML_NAMED_ELEMENT(), und QML_FOREIGN().
QML_IMPLEMENTS_INTERFACES(interfaces)
Dieses Makro teilt Qt mit, welche QML interfaces die Klasse implementiert. Dieses Makro sollte nur für Schnittstellen mit Klassen verwendet werden, die QML_INTERFACE verwenden, andernfalls verwenden Sie Q_INTERFACES. Es wird benötigt, damit die deklarative Registrierung über QML_ELEMENT richtig funktioniert.
Siehe auch QML_INTERFACE und Q_INTERFACES.
QML_INTERFACE
Dieses Makro registriert den umschließenden C++-Typ im QML-System als Schnittstelle.
Typen, die als Schnittstelle in QML registriert sind, sollten sich selbst auch als Schnittstelle im Meta-Objektsystem deklarieren. Ein Beispiel:
struct FooInterface { QML_INTERFACE public: virtual ~FooInterface(); virtual void doSomething() = 0; }; Q_DECLARE_INTERFACE(FooInterface, "org.foo.FooInterface")
Wenn sie auf diese Weise bei QML registriert sind, können sie als Eigenschaftstypen verwendet werden:
Q_PROPERTY(FooInterface *foo READ foo WRITE setFoo)
Wenn Sie dieser Eigenschaft eine Unterklasse von QObject zuweisen, führt die QML-Engine den Schnittstellen-Cast nach FooInterface*
automatisch durch.
Schnittstellentypen sind in QML implizit anonym und nicht anlegbar.
HINWEIS: Wenn Sie von Typen mit QML_INTERFACE erben, verwenden Sie QML_IMPLEMENTS_INTERFACES anstelle von Q_INTERFACES.
Siehe auch QML_IMPLEMENTS_INTERFACES(), QML_ELEMENT, QML_NAMED_ELEMENT(), QML_UNCREATABLE(), und QML_ANONYMOUS.
QML_NAMED_ELEMENT(name)
Deklariert den umschließenden Typ oder Namespace als in QML verfügbar, wobei name als Elementname verwendet wird. Andernfalls verhält es sich genauso wie QML_ELEMENT.
class SqlEventDatabase : public QObject { Q_OBJECT QML_NAMED_ELEMENT(EventDatabase) // ... };
Siehe auch Auswahl der korrekten Integrationsmethode zwischen C++ und QML und QML_ELEMENT.
QML_REMOVED_IN_VERSION(MAJOR, MINOR)
Deklariert, dass der umschließende Typ oder Namespace in der angegebenen MAJOR.MINOR Version entfernt wurde. Dies ist vor allem nützlich, wenn die Implementierung eines QML-Typs ersetzt werden soll. Wenn ein entsprechendes QML_ADDED_IN_VERSION() auf einem anderen Typ oder Namespace des gleichen QML-Namens vorhanden ist, wird der entfernte Typ verwendet, wenn Versionen des Moduls kleiner als MAJOR.MINOR importiert werden, und der hinzugefügte Typ wird verwendet, wenn Versionen des Moduls größer oder gleich MAJOR.MINOR importiert werden.
QML_REMOVED_IN_VERSION() wird nur wirksam, wenn der Typ oder Namespace in QML verfügbar ist, indem ein QML_ELEMENT, QML_NAMED_ELEMENT(), QML_ANONYMOUS oder QML_INTERFACE Makro vorhanden ist.
Siehe auch QML_ELEMENT und QML_NAMED_ELEMENT.
QML_SEQUENTIAL_CONTAINER(VALUE_TYPE)
Dieses Makro deklariert den umschließenden oder referenzierten Typ als einen sequentiellen Container, der eine Folge von VALUE_TYPE Elementen verwaltet. VALUE_TYPE kann ein tatsächlicher Werttyp oder ein Zeiger auf einen Objekttyp sein. Es ist selten möglich, dieses Makro der eigentlichen Containerdeklaration hinzuzufügen, da Container normalerweise Vorlagen sind. Sie sollten QML_FOREIGN verwenden, um die Typregistrierung an eine Vorlageninstanziierung anzuhängen. Mit dieser Technik können Sie z. B. sequenzielle Container wie folgt deklarieren:
class IntDequeRegistration { Q_GADGET QML_FOREIGN(std::deque<int>) QML_ANONYMOUS QML_SEQUENTIAL_CONTAINER(int) };
Danach können Sie den Container wie ein JavaScript-Array in QML verwenden.
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([...]) } }
Hinweis: Für QML-Wertetypen wird QList automatisch als sequentieller Container registriert. Für QML-Objekttypen ist QQmlListProperty. Sie müssen diese Registrierungen nicht hinzufügen.
Hinweis: Sie können dem Container derzeit keinen eigenen Namen geben. Jedes Argument, das an QML_NAMED_ELEMENT übergeben wird, wird ignoriert. Die automatisch registrierten sequentiellen Container sind unter den bekannten list<...> Namen verfügbar, zum Beispiel list<QtObject> oder list<font>.
Hinweis: Der Klassenname muss voll qualifiziert sein, auch wenn man sich bereits im Namespace befindet.
Siehe auch QML_ANONYMOUS und QML_FOREIGN().
QML_SINGLETON
Deklariert den umschließenden Typ zu einem Singleton in QML. Dies wird nur wirksam, wenn der Typ ein Q_OBJECT ist und in QML verfügbar ist (durch ein QML_ELEMENT oder QML_NAMED_ELEMENT() Makro). Standardmäßig versucht QQmlEngine beim ersten Zugriff auf den Typ eine Singleton-Instanz entweder mit dem Standardkonstruktor des Typs oder mit einer statischen Fabrikfunktion der Signatur T *create(QQmlEngine *, QJSEngine *)
zu erzeugen. Wenn beide existieren und zugänglich sind, wird der Standard-Konstruktor bevorzugt. Wenn es keinen Standardkonstruktor und keine Fabrikfunktion gibt, ist das Singleton unzugänglich. Die QML-Engine übernimmt im Allgemeinen den Besitz des Singletons und wird es löschen, wenn die Engine selbst zerstört wird. Sie können dies verhindern, indem Sie QJSEngine::setObjectOwnership() für das Singleton aufrufen.
Um eine standardmäßig konstruierbare Klasse als Singleton zu deklarieren, müssen Sie nur QML_SINGLETON hinzufügen:
class MySingleton : public QObject { Q_OBJECT QML_ELEMENT QML_SINGLETON // Q_PROPERTY( ... ) public: // members, Q_INVOKABLE functions, etc. };
Wenn die Singleton-Klasse nicht standardmäßig konstruierbar ist, Sie sie aber ändern können, können Sie ihr eine Factory-Funktion hinzufügen, um sie zugänglich zu machen:
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 };
Wenn Sie die Klasse nicht modifizieren können und sie weder einen Standardkonstruktor noch eine geeignete Fabrikfunktion hat, können Sie einen QML_FOREIGN Wrapper bereitstellen, um die Fabrikfunktion zu definieren:
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; } };
Wenn Sie schließlich ein bestimmtes Singleton-Objekt bereitstellen möchten, dessen Erstellung Sie nicht kontrollieren können, können Sie dieses von einer Fabrikfunktion zurückgeben. Dies ist ein Ersatz für die Funktion qmlRegisterSingletonInstance. Wenn Sie die Funktion
qmlRegisterSingletonInstance("MyModule", 1, 0, "MySingleton", myObject);
aufrufen, wobei myObject vom Typ MySingleton *
ist, können Sie stattdessen Folgendes tun:
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; };
Auf diese Weise wird die bereits existierende Klasse MySingleton
zu einem QML-Singleton mit dem Namen MySingleton
deklariert. Sie können jederzeit eine Instanz für sie angeben, bevor sie verwendet wird, indem Sie das Mitglied s_singletonInstance
setzen. Nichts von alledem erfordert eine Änderung von MySingleton
selbst.
Hinweis: Dieses Muster funktioniert nicht, wenn auf das Singleton entweder von mehreren QML-Engines zugegriffen wird oder wenn die QML-Engine, die darauf zugreift, eine andere Thread-Affinität hat als das Singleton-Objekt selbst. Wie oben gezeigt, können Sie die Parameter der Methode create()
auf Identität und Thread-Affinität der Engine überprüfen, um dies zu bestätigen.
Siehe auch QML_ELEMENT, QML_NAMED_ELEMENT(), qmlRegisterSingletonInstance(), QQmlEngine::singletonInstance(), und Singletons in QML.
[since 6.5]
QML_STRUCTURED_VALUE
Markiert den umgebenden Wertetyp als strukturiert. Strukturierte Wertetypen können und werden vorzugsweise property-by-property aus einem JavaScript-Objekt konstruiert. Ein strukturierter Wertetyp ist jedoch immer auch QML_CONSTRUCTIBLE_VALUE. Das bedeutet, dass Sie immer noch Q_INVOKABLE Konstruktoren zur Verfügung stellen können, um die Konstruktion aus primitiven Typen zu handhaben.
Sie können einen strukturierten Wertetyp wie folgt deklarieren:
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) // ... };
Dann können Sie eine Eigenschaft dieses Typs wie folgt ausfüllen:
QtObject { property myValueType v: ({d: 4.4, e: "a string"}) }
Die zusätzlichen Klammern sind notwendig, um das JavaScript-Objekt von dem zu unterscheiden, was als JavaScript-Codeblock interpretiert werden könnte.
Sie können auch Listen von Werten auf diese Weise konstruieren:
QtObject { property list<myValueType> v: [ {d: 4.4, e: "a string"}, {d: 7.1, e: "another string"} ] }
Wenn Sie Wertetypen adressierbar machen, können Sie einen solchen Typ in einer Type Assertion verwenden, um ihn explizit zu konstruieren:
pragma ValueTypeBehavior: Addressable QtObject { function process(d: real) { let v = {d: d, e: objectName} as myValueType; // v is a myValueType now } }
Dieses Makro wurde in Qt 6.5 eingeführt.
Siehe auch QML_VALUE_TYPE und QML_CONSTRUCTIBLE_VALUE.
QML_UNAVAILABLE
Dieses Makro deklariert den umschließenden Typ als in QML nicht verfügbar. Es registriert einen internen Dummy-Typ mit der Bezeichnung QQmlTypeNotAvailable
als QML_FOREIGN()-Typ und verwendet alle weiteren von Ihnen angegebenen QML-Makros.
Normalerweise sollten die von einem Modul exportierten Typen fest sein. Wenn jedoch ein C++-Typ nicht verfügbar ist, sollten Sie zumindest den QML-Typnamen "reservieren" und dem Benutzer des nicht verfügbaren Typs eine sinnvolle Fehlermeldung geben.
Beispiel:
#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
Dies führt dazu, dass jede QML, die versucht, den Typ "Game" zu verwenden, eine Fehlermeldung erzeugt:
fun.qml: Get back to work, slacker! Game { ^
Mit dieser Technik benötigen Sie nur eine Q_GADGET struct, um die Fehlermeldung anzupassen, und keine vollwertige QObject. Ohne QML_UNCREATABLE() führt QML_UNAVAILABLE immer noch zu einer spezifischeren Fehlermeldung als die übliche "is not a type" für völlig unbekannte Typen.
Hinweis: Der Klassenname muss voll qualifiziert sein, auch wenn man sich bereits im Namespace befindet.
Siehe auch QML_ELEMENT, QML_NAMED_ELEMENT(), QML_UNCREATABLE(), und QML_FOREIGN().
QML_UNCREATABLE(reason)
Deklariert, dass der umschließende Typ nicht aus QML erzeugt werden kann. Dies tritt in Kraft, wenn der Typ in QML verfügbar ist, indem er ein QML_ELEMENT oder QML_NAMED_ELEMENT() Makro hat. Das reason wird als Fehlermeldung ausgegeben, wenn ein Versuch, den Typ aus QML zu erstellen, erkannt wird.
Einige QML-Typen sind implizit nicht anlegbar, insbesondere Typen, die mit QML_ANONYMOUS oder Namespaces, die mit QML_ELEMENT oder QML_NAMED_ELEMENT() angezeigt werden.
Seit Qt 6.0 können Sie "" anstelle eines Grundes verwenden, um stattdessen eine Standardmeldung zu verwenden.
Siehe auch QML_ELEMENT, QML_NAMED_ELEMENT(), und QML_ANONYMOUS.
QML_VALUE_TYPE(name)
Deklariert den umschließenden Typ oder Namespace, der in QML verfügbar sein soll, unter Verwendung von name als Name. Der Typ muss ein Wertetyp sein und der Name muss klein geschrieben werden.
class MyValueType { Q_GADGET QML_VALUE_TYPE(myValueType) // ... };
Siehe auch Auswahl der korrekten Integrationsmethode zwischen C++ und QML und 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.