Класс 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 или AnimatedImage объекта. При включении этого параметра запрос изображения к поставщику выполняется в потоке с низким приоритетом, что позволяет выполнять загрузку изображений в фоновом режиме и снижает влияние на пользовательский интерфейс.
Чтобы принудительно выполнить асинхронную загрузку изображений, даже для источников изображений, у которых asynchronous свойство не установлено в true, вы можете передать QQmlImageProviderBase::ForceAsynchronousImageLoading флаг конструктору поставщика изображений. Это гарантирует, что все запросы на изображения для поставщика обрабатываются в отдельном потоке.
Асинхронная загрузка для поставщиков изображений, предоставляющих QPixmap, поддерживается только на платформах, которые имеют функцию ThreadedPixmaps, а на платформах, где пиксель-массивы могут быть созданы только в главном потоке (т.е. ThreadedPixmaps не поддерживается), если асинхронная установлено в true, значение игнорируется, и изображение загружается синхронно.
Асинхронная загрузка изображений для поставщиков типа, отличного от ImageResponse, выполняется в одном потоке на основе каждого движка. Это означает, что медленный поставщик изображений заблокирует загрузку любого другого запроса. Чтобы этого избежать, мы рекомендуем использовать QQuickAsyncImageProvider и реализовать потоковую обработку на стороне поставщика с помощью QThreadPool или подобного. См. Пример поставщика Image Response для полной реализации.
Кэширование изображений
Изображения, возвращаемые QQuickImageProvider, автоматически кэшируются, аналогично любому изображению, загруженному движком QML. Когда изображение с префиксом "image://" загружается из кэша, requestImage() и requestPixmap() не будут вызываться для соответствующего поставщика изображений. Если изображение всегда должно загружаться от поставщика изображений и не должно кэшироваться вообще, установите cache свойство в false для соответствующего Image, BorderImage или AnimatedImage объекта.
См. также 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.14/qquickimageprovider.html