Spec-Zone.ru › Qt 5.6

Класс 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
virtual ImageType imageType() const
  • 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. На платформах, где пиксы могут создаваться только в главном потоке (т.е. 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

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

[virtual] Flags QQuickImageProvider::flags() const

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

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

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

Spec-Zone.ru

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