QQuickImageProvider Class
Die Klasse QQuickImageProvider bietet eine Schnittstelle zur Unterstützung von Pixmaps und Threaded Image Requests in QML. Mehr...
Kopfzeile: | #include <QQuickImageProvider> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Quick) target_link_libraries(mytarget PRIVATE Qt6::Quick) |
qmake: | QT += quick |
Vererbt: | QQmlImageProviderBase |
Vererbt von: |
Öffentliche Funktionen
QQuickImageProvider(QQmlImageProviderBase::ImageType type, QQmlImageProviderBase::Flags flags = Flags()) | |
virtual | ~QQuickImageProvider() override |
virtual QImage | requestImage(const QString &id, QSize *size, const QSize &requestedSize) |
virtual QPixmap | requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) |
virtual QQuickTextureFactory * | requestTexture(const QString &id, QSize *size, const QSize &requestedSize) |
Reimplementierte öffentliche Funktionen
virtual QQmlImageProviderBase::Flags | flags() const override |
virtual QQmlImageProviderBase::ImageType | imageType() const override |
Detaillierte Beschreibung
QQuickImageProvider wird verwendet, um erweiterte Bildladefunktionen in QML-Anwendungen bereitzustellen. Er ermöglicht es, Bilder in QML zu laden:
- Laden mit QPixmaps anstelle von tatsächlichen Bilddateien
- Asynchrones Laden in einem separaten Thread
Um anzugeben, dass ein Bild von einem Bildanbieter geladen werden soll, verwenden Sie das Schema "image:" für die URL-Quelle des Bildes, gefolgt von den Bezeichnern des Bildanbieters und des angeforderten Bildes. Zum Beispiel:
Image { source: "image://myimageprovider/image.png" }
Hier wird angegeben, dass das Bild von dem Bildanbieter "myimageprovider" geladen werden soll, und das zu ladende Bild heißt "image.png". Die QML-Engine ruft den entsprechenden Bildanbieter entsprechend den Anbietern auf, die über QQmlEngine::addImageProvider() registriert wurden.
Beachten Sie, dass bei den Bezeichnern die Groß- und Kleinschreibung nicht beachtet wird, aber der Rest der URL wird unter Beibehaltung der Groß- und Kleinschreibung weitergegeben. Der folgende Ausschnitt würde zum Beispiel immer noch angeben, dass das Bild von dem Bildanbieter "myimageprovider" geladen wird, aber er würde ein anderes Bild anfordern als der obige Ausschnitt ("Image.png" statt "image.png").
Image { source: "image://MyImageProvider/Image.png" }
Wenn Sie möchten, dass die Groß- und Kleinschreibung im Rest der URL nicht beachtet wird, müssen Sie das in Ihrem Bildanbieter selbst regeln.
Ein Beispiel
Hier sind zwei Bilder. Ihre source
Werte zeigen an, dass sie von einem Bildanbieter namens "colors" geladen werden sollen, und die zu ladenden Bilder sind "yellow" bzw. "red":
Wenn diese Bilder von QML geladen werden, sucht es nach einem passenden Bildanbieter und ruft dessen Methode requestImage() oder requestPixmap() auf (abhängig von imageType()), um das Bild zu laden. Die Methode wird mit dem Parameter id
aufgerufen, der für das erste Bild auf "gelb" und für das zweite Bild auf "rot" gesetzt ist.
Hier ist eine Bildanbieter-Implementierung, die die von der obigen QML angeforderten Bilder laden kann. Diese Implementierung erzeugt dynamisch QPixmap Bilder, die mit der angeforderten Farbe gefüllt sind:
class ColorImageProvider : public QQuickImageProvider { public: ColorImageProvider() : QQuickImageProvider(QQuickImageProvider::Pixmap) { } QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) override { int width = 100; int height = 50; if (size) *size = QSize(width, height); QPixmap pixmap(requestedSize.width() > 0 ? requestedSize.width() : width, requestedSize.height() > 0 ? requestedSize.height() : height); pixmap.fill(QColor(id).rgba()); return pixmap; } };
Um diesen Provider für QML zugänglich zu machen, wird er bei der QML-Engine mit einem "colors"-Identifikator registriert:
int main(int argc, char *argv[]) { QQuickView view; QQmlEngine *engine = view.engine(); engine->addImageProvider(QLatin1String("colors"), new ColorImageProvider); view.setSource(QUrl::fromLocalFile(QStringLiteral("imageprovider-example.qml"))); view.show(); return app.exec(); }
Nun können die Bilder erfolgreich in QML geladen werden:
Die vollständige Implementierung finden Sie im Image Provider-Beispiel. Beachten Sie, dass das Beispiel den Provider über eine plugin registriert, anstatt ihn wie oben gezeigt in der Funktion main()
der Anwendung zu registrieren.
Es ist möglich, "@nx" high DPI syntax bereitzustellen.
Asynchrones Laden von Bildern
Bildanbieter, die das Laden von QImage oder Texturen unterstützen, bieten automatisch Unterstützung für asynchrones Laden von Bildern. Um das asynchrone Laden für eine Bildquelle zu aktivieren, setzen Sie die Eigenschaft asynchronous
auf true
für das entsprechende Image oder BorderImage Objekt. Wenn dies aktiviert ist, wird die Bildanforderung an den Anbieter in einem Thread mit niedriger Priorität ausgeführt, wodurch das Laden von Bildern im Hintergrund ausgeführt werden kann und die Leistungsauswirkungen auf die Benutzeroberfläche verringert werden.
Um das asynchrone Laden von Bildern zu erzwingen, auch für Bildquellen, bei denen die Eigenschaft asynchronous
nicht auf true
gesetzt ist, können Sie das Flag QQmlImageProviderBase::ForceAsynchronousImageLoading
an den Konstruktor des Bildanbieters übergeben. Dadurch wird sichergestellt, dass alle Bildanfragen für den Anbieter in einem separaten Thread bearbeitet werden.
Das asynchrone Laden von Bildanbietern, die QPixmap bereitstellen, wird nur auf Plattformen unterstützt, die über die ThreadedPixmaps-Funktion verfügen. Auf Plattformen, auf denen Pixmaps nur im Haupt-Thread erstellt werden können (d. h. ThreadedPixmaps wird nicht unterstützt), wird der Wert asynchronous auf true
gesetzt, ignoriert und das Bild wird synchron geladen.
Das asynchrone Laden von Bildern für Anbieter eines anderen Typs als ImageResponse wird auf der Basis eines einzelnen Threads pro Engine ausgeführt. Das bedeutet, dass ein langsamer Bildanbieter das Laden aller anderen Anfragen blockiert. Um dies zu vermeiden, empfehlen wir die Verwendung von QQuickAsyncImageProvider und die Implementierung von Threading auf der Anbieterseite über QThreadPool
oder ähnliches. Eine vollständige Implementierung finden Sie im Image Response Provider-Beispiel.
Bild-Caching
Bilder, die von einem QQuickImageProvider zurückgegeben werden, werden automatisch zwischengespeichert, ähnlich wie jedes Bild, das von der QML-Engine geladen wird. Wenn ein Bild mit einem "image://"-Präfix aus dem Cache geladen wird, werden requestImage() und requestPixmap() für den entsprechenden Bildanbieter nicht aufgerufen. Wenn ein Bild immer vom Bildanbieter geholt und nicht im Cache gespeichert werden soll, setzen Sie die Eigenschaft cache
auf false
für das entsprechende Image oder BorderImage Objekt.
Siehe auch QQmlEngine::addImageProvider().
Dokumentation der Mitgliedsfunktionen
QQuickImageProvider::QQuickImageProvider(QQmlImageProviderBase::ImageType type, QQmlImageProviderBase::Flags flags = Flags())
Erzeugt einen Bildanbieter, der Bilder der angegebenen type bereitstellt und sich entsprechend der angegebenen flags verhält.
[override virtual noexcept]
QQuickImageProvider::~QQuickImageProvider()
Zerstört die QQuickImageProvider
Hinweis: Der Destruktor Ihrer abgeleiteten Klasse muss thread-sicher sein.
[override virtual]
QQmlImageProviderBase::Flags QQuickImageProvider::flags() const
Reimplements: QQmlImageProviderBase::flags() const.
Gibt die für diesen Anbieter gesetzten Flags zurück.
[override virtual]
QQmlImageProviderBase::ImageType QQuickImageProvider::imageType() const
Reimplements: QQmlImageProviderBase::imageType() const.
Gibt den von diesem Anbieter unterstützten Bildtyp zurück.
[virtual]
QImage QQuickImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize)
Implementieren Sie diese Methode, um das Bild mit id zurückzugeben. Die Standardimplementierung gibt ein leeres Bild zurück.
id ist die angeforderte Bildquelle, wobei das "image:"-Schema und die Anbieterkennung entfernt werden. Wenn das Bild source zum Beispiel "image://myprovider/icons/home" war, wäre die angegebene id "icons/home".
Die requestedSize entspricht der Image::sourceSize, die von einem Image-Element angefordert wird. Wenn requestedSize eine gültige Größe ist, sollte das zurückgegebene Bild diese Größe haben.
In allen Fällen muss size auf die Originalgröße des Bildes eingestellt werden. Dies wird verwendet, um die Werte width und height des entsprechenden Image zu setzen, wenn diese Werte nicht explizit gesetzt wurden.
Hinweis: Diese Methode kann von mehreren Threads aufgerufen werden; stellen Sie daher sicher, dass die Implementierung dieser Methode reentrant ist.
[virtual]
QPixmap QQuickImageProvider::requestPixmap(const QString &id, QSize *size, const QSize &requestedSize)
Implementieren Sie diese Methode, um die Pixmap mit id zurückzugeben. Die Standardimplementierung gibt eine leere Pixmap zurück.
Die id ist die angeforderte Bildquelle, wobei das "image:"-Schema und die Anbieterkennung entfernt werden. Wenn das Bild source zum Beispiel "image://myprovider/icons/home" lautet, würde die angegebene id "icons/home" lauten.
Die requestedSize entspricht der Image::sourceSize, die von einem Image-Element angefordert wird. Wenn requestedSize eine gültige Größe ist, sollte das zurückgegebene Bild diese Größe haben.
In allen Fällen muss size auf die Originalgröße des Bildes eingestellt werden. Dies wird verwendet, um die Werte width und height des entsprechenden Image zu setzen, wenn diese Werte nicht explizit gesetzt wurden.
Hinweis: Diese Methode kann von mehreren Threads aufgerufen werden; stellen Sie daher sicher, dass die Implementierung dieser Methode reentrant ist.
[virtual]
QQuickTextureFactory *QQuickImageProvider::requestTexture(const QString &id, QSize *size, const QSize &requestedSize)
Implementieren Sie diese Methode, um die Textur mit id zurückzugeben. Die Standardimplementierung gibt nullptr
zurück.
id ist die angeforderte Bildquelle, wobei das "image:"-Schema und die Anbieterkennung entfernt werden. Wenn das Bild source zum Beispiel "image://myprovider/icons/home" lautet, würde die angegebene id "icons/home" lauten.
Die requestedSize entspricht der Image::sourceSize, die von einem Image-Element angefordert wird. Wenn requestedSize eine gültige Größe ist, sollte das zurückgegebene Bild diese Größe haben.
In allen Fällen muss size auf die Originalgröße des Bildes eingestellt werden. Dies wird verwendet, um die Werte width und height des entsprechenden Image zu setzen, wenn diese Werte nicht explizit gesetzt wurden.
Hinweis: Diese Methode kann von mehreren Threads aufgerufen werden; stellen Sie daher sicher, dass die Implementierung dieser Methode reentrant ist.
© 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.