Spec-Zone.ru › Qt 5.11

Класс QQuickImageProvider

Класс QQuickImageProvider предоставляет интерфейс для поддержки растровых изображений и запросов к изображениям в потоках в QML. Подробнее...

Заголовок: #include <QQuickImageProvider>
qmake: QT += quick
С момента: Qt 5.0
Наследуется от: QQmlImageProviderBase
Наследует:

QQuickAsyncImageProvider

  • Список всех членов, включая унаследованные

Открытые функции

QQuickImageProvider(QQmlImageProviderBase::ImageType type, QQmlImageProviderBase::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
  • 2 открытые функции унаследованы от QQmlImageProviderBase

Подробное описание

Класс QQuickImageProvider предоставляет интерфейс для поддержки растровых изображений и запросов к изображениям в потоках в QML.

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 не поддерживается), если asynchronous установлен в true, это значение игнорируется, и изображение загружается синхронно.

Асинхронная загрузка изображений для поставщиков других типов, кроме ImageResponse, выполняется в одном потоке на основе двигателя. Это означает, что медленный поставщик изображений заблокирует загрузку любого другого запроса. Чтобы избежать этого, мы рекомендуем использовать QQuickAsyncImageProvider и реализовать многопоточность в поставщике через QThreadPool или аналогичное. См. Пример поставщика ответов на изображения для полной реализации.

Кэширование изображений

Изображения, возвращаемые QQuickImageProvider, автоматически кэшируются, как и любое загружаемое изображение движком QML. Когда изображение с префиксом «image://» загружается из кэша, requestImage() и requestPixmap() не будут вызываться для соответствующего поставщика изображений. Если изображение всегда должно извлекаться из поставщика изображений и не должно кэшироваться вообще, установите свойство cache в значение false для соответствующего объекта Image, BorderImage или AnimatedImage.

Версия этого класса для Qt Quick 1 называется QDeclarativeImageProvider.

См. также QQmlEngine::addImageProvider().

Документация по функциям членов

QQuickImageProvider::QQuickImageProvider(QQmlImageProviderBase::ImageType type, QQmlImageProviderBase::Flags flags = ...)

Создаёт поставщик изображений, который будет предоставлять изображения заданного типа type и вести себя в соответствии с заданными флагами flags.

[override virtual] QQuickImageProvider::~QQuickImageProvider()

Уничтожает QQuickImageProvider

Примечание: Деструктор вашего производного класса должен быть потокобезопасным.

[override virtual] QQmlImageProviderBase::Flags QQuickImageProvider::flags() const

Переопределяет QQmlImageProviderBase::flags().

Возвращает флаги, установленные для этого поставщика.

[override virtual] QQmlImageProviderBase::ImageType QQuickImageProvider::imageType() const

Переопределяет QQmlImageProviderBase::imageType().

Возвращает тип изображения, поддерживаемый этим поставщиком.

[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 необходимо установить в исходный размер изображения. Это используется для задания ширины и высоты соответствующего элемента Image, если эти значения не заданы явно.

Примечание: этот метод может вызываться из нескольких потоков, поэтому убедитесь, что его реализация потокобезопасна.

[virtual] QPixmap QQuickImageProvider::requestPixmap(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 необходимо установить в исходный размер изображения. Это используется для задания ширины и высоты соответствующего элемента Image, если эти значения не заданы явно.

Примечание: этот метод может вызываться из нескольких потоков, поэтому убедитесь, что его реализация потокобезопасна.

[virtual] QQuickTextureFactory *QQuickImageProvider::requestTexture(const QString &id, QSize *size, const QSize &requestedSize)

Реализуйте этот метод для возврата текстуры с идентификатором id. По умолчанию возвращается 0.

id — запрашиваемый источник изображения, из которого удалены схема «image:» и идентификатор провайдера. Например, если изображение source было «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/archives/qt-5.11/qquickimageprovider.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API