Класс QQuickImageProvider
Класс QQuickImageProvider предоставляет интерфейс для поддержки растровых изображений и потоковых запросов к изображениям в QML. Подробнее...
| Заголовок: | #include <QQuickImageProvider> |
| qmake: | QT += quick |
| С момента: | Qt 5.0 |
| Наследуется от: | QQmlImageProviderBase |
| Наследует: |
Этот класс был представлен в Qt 5.0.
Открытые функции
| 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:
- Загружаться с использованием QPixmaps, а не с использованием файлов изображений
- Загружаться асинхронно в отдельном потоке
Чтобы указать, что изображение должно загружаться поставщиком изображений, используйте схему "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 должен быть установлен на исходный размер изображения. Это используется для установки width и height соответствующего Image, если эти значения не были явно заданы.
Примечание: данный метод может вызываться из нескольких потоков, поэтому необходимо обеспечить его потокобезопасность.
[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 должен быть установлен в исходный размер изображения. Это используется для установки ширины и высоты соответствующего элемента Image, если эти значения не были явно установлены.
Примечание: данный метод может вызываться из нескольких потоков, поэтому необходимо обеспечить его потокобезопасность.
[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 должен быть установлен в исходный размер изображения. Это используется для установки ширины и высоты соответствующего элемента Image, если эти значения не были явно установлены.
Примечание: данный метод может вызываться из нескольких потоков, поэтому необходимо обеспечить его потокобезопасность.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/qquickimageprovider.html