Класс QQuickImageProvider
Класс QQuickImageProvider предоставляет интерфейс для поддержки растровых изображений и потоковых запросов к изображениям в QML. Подробнее...
| Заголовок: | #include <QQuickImageProvider> |
| CMake: | find_package(Qt6 COMPONENTS Quick REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Quick) |
| qmake: | QT += quick |
| С версии: | Qt 5.0 |
| Наследует: | QQmlImageProviderBase |
| Наследуется: |
Открытые функции
| 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) |
Переопределённые открытые функции
| virtual QQmlImageProviderBase::Flags | flags() const override |
| virtual QQmlImageProviderBase::ImageType | imageType() const override |
Подробное описание
QQuickImageProvider используется для предоставления расширенных возможностей загрузки изображений в приложениях QML. Он позволяет изображениям в QML:
- Загружаться с помощью QPixmap, а не с помощью файлов изображений
- Загружаться асинхронно в отдельном потоке
Чтобы указать, что изображение должно загружаться поставщиком изображений, используйте схему «image:» для исходного URL-адреса изображения, за которой следуют идентификаторы поставщика изображений и запрашиваемого изображения. Например:
Image { source: "image://myimageprovider/image.png" } Это указывает, что изображение должно загружаться поставщиком изображений с именем «myimageprovider», а изображение, которое нужно загрузить, называется «image.png». Двигатель QML вызывает соответствующий поставщик изображений в соответствии с поставщиками, которые были зарегистрированы с помощью QQmlEngine::addImageProvider().
Обратите внимание, что идентификаторы регистронезависимы, но остальная часть URL-адреса будет передаваться с сохранением регистра. Например, следующий фрагмент кода по-прежнему укажет, что изображение загружается поставщиком изображений с именем «myimageprovider», но он запросит другое изображение, чем предыдущий фрагмент («Image.png» вместо «image.png»).
Image { source: "image://MyImageProvider/Image.png" } Если вы хотите, чтобы остальная часть URL-адреса была регистронезависимой, вам нужно будет позаботиться об этом самим внутри вашего поставщика изображений.
Пример
Вот два изображения. Их source значения указывают, что они должны загружаться поставщиком изображений с именем «colors», а изображения, которые нужно загрузить, — «yellow» и «red» соответственно:
Column {
Image { source: "image://colors/yellow" }
Image { source: "image://colors/red" }
} При загрузке этих изображений QML он ищет соответствующий поставщик изображений и вызывает его метод requestImage() или requestPixmap() (в зависимости от его imageType()) для загрузки изображения. Метод вызывается со значением параметра id, установленным на «yellow» для первого изображения и «red» для второго.
Вот реализация поставщика изображений, которая может загружать изображения, запрошенные в QML выше. Эта реализация динамически генерирует QPixmap изображения, которые заполняются запрошенным цветом:
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;
}
}; Чтобы сделать этот поставщик доступным для QML, он регистрируется в движке QML с идентификатором «colors»:
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();
} Теперь изображения можно успешно загрузить в QML:
См. Пример поставщика изображений для полной реализации. Обратите внимание, что в примере поставщик регистрируется через плагин, а не в функции приложения main() , как показано выше.
Асинхронная загрузка изображений
Поставщики изображений, которые поддерживают QImage или загрузку текстур, автоматически включают поддержку асинхронной загрузки изображений. Чтобы включить асинхронную загрузку для источника изображения, установите свойство asynchronous в true для соответствующего объекта Image или BorderImage. При включении этого параметра запрос изображения к поставщику выполняется в потоке с низким приоритетом, что позволяет выполнять загрузку изображений в фоновом режиме и снижает влияние на производительность пользовательского интерфейса.
Чтобы принудительно выполнить асинхронную загрузку изображений, даже для источников изображений, у которых свойство asynchronous не установлено в true, вы можете передать флаг QQmlImageProviderBase::ForceAsynchronousImageLoading конструктору поставщика изображений. Это гарантирует, что все запросы изображений для поставщика обрабатываются в отдельном потоке.
Асинхронная загрузка для поставщиков изображений, предоставляющих QPixmap, поддерживается только в платформах, имеющих функцию ThreadedPixmaps. В платформах, где пиксель изображения можно создавать только в основном потоке (т. е. ThreadedPixmaps не поддерживается), если свойство asynchronous установлено в true, значение игнорируется, и изображение загружается синхронно.
Асинхронная загрузка изображений для поставщиков других типов, кроме ImageResponse, выполняется в одном потоке на основе двигателя. Это означает, что медленный поставщик изображений заблокирует загрузку любого другого запроса. Чтобы избежать этого, рекомендуется использовать QQuickAsyncImageProvider и реализовать многопоточность на стороне поставщика с помощью QThreadPool или аналогичного метода. См. Пример поставщика ответов на изображения для полной реализации.
Кэширование изображений
Изображения, возвращаемые QQuickImageProvider, автоматически кэшируются, аналогично любым изображениям, загруженным движком QML. При загрузке изображения с префиксом «image://» из кэша методы requestImage() и requestPixmap() не будут вызваны для соответствующего поставщика изображений. Если изображение всегда должно загружаться из поставщика изображений и не должно кэшироваться, установите свойство cache в false для соответствующего объекта Image или BorderImage.
См. также QQmlEngine::addImageProvider().
Документация по функциям членов
QQuickImageProvider::QQuickImageProvider(QQmlImageProviderBase::ImageType type, QQmlImageProviderBase::Flags flags = Flags())
Создает поставщик изображений, который будет предоставлять изображения заданного типа type и вести себя в соответствии с заданными флагами flags.
[override virtual] QQuickImageProvider::~QQuickImageProvider()
Удаляет QQuickImageProvider
Примечание: Деструктор вашего производного класса должен быть потокобезопасным.
[override virtual] QQmlImageProviderBase::Flags QQuickImageProvider::flags() const
Переопределяет: QQmlImageProviderBase::flags() const.
Возвращает флаги, установленные для этого поставщика.
[override virtual] QQmlImageProviderBase::ImageType QQuickImageProvider::imageType() const
Переопределяет: QQmlImageProviderBase::imageType() const.
Возвращает тип изображения, поддерживаемый этим поставщиком.
[virtual] QImage QQuickImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize)
Реализуйте этот метод для возврата изображения с id. По умолчанию реализация возвращает пустое изображение.
id — запрашиваемый источник изображения, из которого удалены схема «image:» и идентификатор поставщика. Например, если изображение source было «image://myprovider/icons/home», данное id будет «icons/home».
requestedSize соответствует Image::sourceSize, запрошенному элементом Image. Если requestedSize имеет допустимое значение, возвращаемое изображение должно иметь этот размер.
Во всех случаях, size должен быть установлен на исходный размер изображения. Это используется для установки ширины и высоты соответствующего ширины и высоты изображения, если эти значения не были явно установлены.
Примечание: этот метод может вызываться из нескольких потоков, поэтому необходимо обеспечить, что его реализация является повторно-входной.
[virtual] QPixmap QQuickImageProvider::requestPixmap(const QString &id, QSize *size, const QSize &requestedSize)
Реализуйте этот метод для возврата пиктограммы с id. По умолчанию реализация возвращает пустую пиктограмму.
id — это запрашиваемый источник изображения, из которого удалены схема "image:" и идентификатор поставщика. Например, если изображение источник было "image://myprovider/icons/home", то заданное id будет "icons/home".
requestedSize соответствует Image::sourceSize, запрашиваемому элементом Image. Если requestedSize — допустимый размер, возвращаемое изображение должно иметь этот размер.
Во всех случаях, size должен быть установлен на исходный размер изображения. Это используется для установки ширины и высоты соответствующего ширины и высоты изображения, если эти значения не были явно установлены.
Примечание: этот метод может вызываться из нескольких потоков, поэтому необходимо обеспечить, что его реализация является повторно-входной.
[virtual] QQuickTextureFactory *QQuickImageProvider::requestTexture(const QString &id, QSize *size, const QSize &requestedSize)
Реализуйте этот метод для возврата текстуры с id. По умолчанию реализация возвращает nullptr.
id — это запрашиваемый источник изображения, из которого удалены схема "image:" и идентификатор поставщика. Например, если изображение источник было "image://myprovider/icons/home", то заданное id будет "icons/home".
requestedSize соответствует Image::sourceSize, запрашиваемому элементом Image. Если requestedSize — допустимый размер, возвращаемое изображение должно иметь этот размер.
Во всех случаях, size должен быть установлен на исходный размер изображения. Это используется для установки ширины и высоты соответствующего ширины и высоты изображения, если эти значения не были явно установлены.
Примечание: этот метод может вызываться из нескольких потоков, поэтому необходимо обеспечить, что его реализация является повторно-входной.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qquickimageprovider.html