Spec-Zone.ru › Qt 5.9

Класс QQuickImageProvider

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

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

QQuickAsyncImageProvider

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

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

QQuickImageProvider(ImageType type, Flags flags = Flags())
virtual ~QQuickImageProvider()
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 Flags flags() const override
virtual 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)
    {
        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 ColorPixmapProvider);

    ...
}

Теперь изображения могут быть успешно загружены в QML:

См. Пример поставщика изображений для полной реализации. Обратите внимание, что в примере поставщик регистрируется через плагин вместо регистрации в приложении main() функции, как показано выше.

Асинхронная загрузка изображений

Поставщики изображений, поддерживающие QImage или загрузку текстур, автоматически включают поддержку асинхронной загрузки изображений. Чтобы включить асинхронную загрузку для источника изображения, установите свойство asynchronous в значение true для соответствующего объекта Image, BorderImage или AnimatedImage. При включении этого параметра запрос изображения к поставщику выполняется в потоке с низким приоритетом, что позволяет загружать изображение в фоновом режиме и снижает влияние на пользовательский интерфейс.

Чтобы принудительно выполнить асинхронную загрузку изображений, даже для источников изображений, у которых свойство asynchronous не установлено в значение true, вы можете передать флаг QQmlImageProviderBase::ForceAsynchronousImageLoading в конструктор поставщика изображений. Это гарантирует, что все запросы изображений для поставщика обрабатываются в отдельном потоке.

Асинхронная загрузка для поставщиков изображений, предоставляющих QPixmap, поддерживается только на платформах, имеющих функцию ThreadedPixmaps. На платформах, где pixmaps могут создаваться только в главном потоке (т. е. ThreadedPixmaps не поддерживается), если asynchronous установлен на true, это значение игнорируется, и изображение загружается синхронно.

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

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

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

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

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

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

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

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

[virtual] QQuickImageProvider::~QQuickImageProvider()

Уничтожает QQuickImageProvider

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

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

Переопределено из QQmlImageProviderBase::flags().

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

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

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

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.9/qquickimageprovider.html

Spec-Zone.ru

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