Image и изображения. Добавление ресурсов в проект

Последнее обновление: 23.12.2023

Элемент Image предназначен для вывода изображений. Для управления выводом этот элемент предоставляет ряд свойств. Рассмотрим основные из них:

  • asynchronous: указывает, что изображения в локальной файловой системе должны загружаться асинхронно в отдельном потоке. Значение по умолчанию — false, что приводит к блокировке потока пользовательского интерфейса во время загрузки изображения. Установка значения true позволяет построить отзывчивый пользовательский интерфейс, однако изображение в связи с загрузкой отображается не сразу.

  • cache: указывает, следует ли кэшировать изображение. Значение по умолчанию true. Установка значения false полезна при работе с большими изображениями, чтобы гарантировать, что они не кэшируются за счет небольших изображений.

  • fillMode: определяет поведение элемента, если размер исходного изображения отличается от размера элемента

  • horizontalAlignment: выравнивание по горизонтали. Может принимать значения:

    • Image.AlignLeft

    • Image.AlignRight

    • Image.AlignHCenter

  • verticalAlignment: выравнивание по вертикали. Может принимать значения:

    • Image.AlignTop

    • Image.AlignBottom

    • Image.AlignVCenter

  • mirror: определяет, должно ли изображение быть зеркально отражено по горизонтали. Значение по умолчанию false.

  • mirrorVertically: определяет, должно ли изображение быть зеркально отражено по вертикали. Значение по умолчанию false.

  • paintedHeight: хранит фактическую высоту изображения

  • paintedWidth: хранит фактическую ширину изображения

  • progress: хранит прогресс загрзуки изображения - от 0.0 (изображение не загружено) до 1.0 (загрузка завершена)

  • smooth: устанавливает плавность изображения при рендеринге, которая позволяет улучшить визуальное качество, но уменьшает производительность. Значение по умолчанию true

  • source: адрес изображения

  • sourceClipRect: устанавливает отображаемую область изображения

  • sourceSize: представляет объект size, через который с помощью свойств width и height можно масштабировать изображение. Это свойство устанавливает максимальное количество пикселей, сохраняемых для загруженного изображения, чтобы большие изображения не использовали больше памяти, чем необходимо.

    Если фактический размер изображения больше, чем sourceSize, изображение уменьшается. Если только одно измерение размера установлено больше 0, другое измерение устанавливается пропорционально, чтобы сохранить соотношение сторон исходного изображения. (FillMode не зависит от этого.) Если установлены оба параметра sourceSize.width и sourceSize.height, изображение уменьшается до указанного размера, сохраняя соотношение сторон изображения.

  • status: статус изображения. Может принимать следующие значения

    • Image.Null: Изображение не установлено

    • Image.Ready: Изображение загружено.

    • Image.Loading: Изображение в данный момент загружается.

    • Image.Error: Произошла ошибка при загрузке изображения.

Ключевое свойство - source, которое определяет адрес изображения. Однако добавление файла изображения и его связь с элементом Image - не самый интуитивный процесс, поэтому рассмотрим его поэтапно. Прежде всего возьмем файл изображения и добавим его проект. Для этого можно перейти в стандартный интерфейс проводника текущей файловой системы и через него скопировать в проект нужный нам файл. Либо можно все сделать из Qt Creator. Рассмотрим второй вариант. Для этого в Qt Creator перейдем в режим файловой системы проекта:

Переход к файловой системе проекта в Qt Creator

Определим для изображений отдельный каталог. Для этого в открывшемся представлении проекта нажмем правой кнопкой мыши на свободное пространство и во всплывающем контекстном меню выберем New Folder (Добавить папку)

Добавление папки в проект в Qt Creator

Допустим, новая папка будет называться images. Через проводник текущей операционной системы добавим в новую папку файл изображения. Например, в моем случае это будет файл "forest.png":

Добавление файла в папку в проект в Qt Creator

Переключимся обратно на вид проекта (опция Projects), нажмем на название проекта правой кнопкой мыши и в контекстном меню выберем пункт Add Existing Directory...:

Добавление папки ресурсов в проект в Qt Creator

На открывшемся окне выберем ранее добавленную папку images с добавленным в нее изображением

Добавление ресурсов в проект в Qt Creator

После этого в проект будет связан с ресурсами-изображениями из папки images

Добавление и настройка файла ресурсов в проект в Qt Creator

А в файле CMakeLists.txt появится запись о наличии ресурсов в проекте

# Добавляем файлы qml
qt_add_qml_module(QmlApp
    URI path 
    VERSION 1.0
    QML_FILES main.qml
    RESOURCES images/forest.png     # доступный ресурс
)

Мы можем вручную добавить в проект нужные папки и файлы и затем подредактировать файл CMakeLists.txt, чтобы проект воспринимал их как ресурсы.

Для отображения этого изображения в файле main.qml определим следующий интерфейс:

import QtQuick

Window {
    width: 250
    height: 180
    visible: true
    title: "METANIT.COM"
    Image {
        anchors.fill: parent
        source: "images/forest.png"
    }
}

Здесь определен один элемент Image, который растянут по всему пространству окна, а его свойство source указывает на ресурс "images/forest.png". И при запуске приложения отобразится указанный ресурс изображения:

Добавление ресурсов в проект в Qt Creator

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

import QtQuick

Window {
    width: 250
    height: 200
    visible: true
    title: "METANIT.COM"
    Image{
        anchors.fill: parent
        source: "images/forest.png"

        Text {
            text: "Зимний лес"
            width: parent.width
            horizontalAlignment: Text.AlignHCenter
            font.pixelSize: 16
        }
    }
}
Наложение элементов на изображение в элементе Image в QML и Qt

Заполнение пространства изображением

Свойство fillMode определяет поведение элемента, если размер исходного изображения отличается от размера элемента. Может принимать следующие значения:

  • Image.Stretch: изображение масштабируется по размеру

  • Image.PreserveAspectFit: изображение масштабируется равномерно, чтобы соответствовать размеру, без обрезки.

  • Image.PreserveAspectCrop: изображение масштабируется равномерно для заполнения, при необходимости обрезается.

  • Image.Tile: изображение дублируется по горизонтали и вертикали.

  • Image.TileVertically: изображение растягивается по горизонтали и дублируется по вертикали.

  • Image.TileHorizontally: изображение растягивается по вертикали и дублируется по горизонтали.

  • Image.Pad: изображение не изменяется

Пример применения:

import QtQuick

Window {
    width: 250
    height: 450
    visible: true
    title: "METANIT.COM"
    Column{
        anchors.fill: parent
        spacing: 5
        padding: 5
        Row {
            Image {
                width:80
                height: 60
                fillMode: Image.Pad
                source: "images/cpp.png"
            }
            Text { text: "Image.Pad" }
        }
        Row {
            Image {
                width:80
                height: 60
                fillMode: Image.Stretch
                source: "images/cpp.png"
            }
            Text { text: "Image.Stretch" }
        }
        Row {
            Image {
                width:80
                height: 60
                fillMode: Image.PreserveAspectFit
                source: "images/cpp.png"
            }
            Text { text: "Image.PreserveAspectFit" }
        }
        Row {
            Image {
                width:80
                height: 60
                fillMode: Image.PreserveAspectCrop
                source: "images/cpp.png"
            }
            Text { text: "Image.PreserveAspectCrop" }
        }
        Row {
            Image {
                width:80
                height: 60
                fillMode: Image.Tile
                horizontalAlignment: Image.AlignLeft
                verticalAlignment: Image.AlignTop
                source: "images/cpp.png"
            }
            Text { text: "Image.Tile" }
        }
        Row {
            Image {
                width:80
                height: 60
                fillMode: Image.TileVertically
                verticalAlignment: Image.AlignTop
                source: "images/cpp.png"
            }
            Text { text: "Image.TileVertically" }
        }
        Row {
            Image {
                width:80
                height: 60
                fillMode: Image.TileHorizontally
                horizontalAlignment: Image.AlignLeft
                source: "images/cpp.png"
            }
            Text { text: "Image.TileHorizontally" }
        }
    }

}

Стоит отметить, что для опций Image.Tile/Image.TileVertically/Image.TileHorizontally может потребоваться настроить выравнивание.

Масштабирование изображений и элемент Image в QML и Qt

Зеркальное отражение

Свойства mirror и mirrorVertically позволяют отразить изображение по горизонтали и вертикали соответственно:

import QtQuick

Window {
    width: 250
    height: 450
    visible: true
    title: "METANIT.COM"
    Column{
        anchors.fill: parent
        spacing: 5
        padding: 5
        Image {
            width: 80
            height: 80
            source: "images/cpp.png"
        }
        Image {
            width: 80
            height: 80
            mirror:true
            source: "images/cpp.png"
        }
        Image {
            width: 80
            height: 80
            mirrorVertically:true
            source: "images/cpp.png"
        }
    }
}

Здесь первое изображение без какого-либо отражения. Ко второму изображению применяется зеркальное отражение по горизонтали, а к третьему - отражение по вертикали:

Зеркальное отражение изображений в QML и Qt
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850