Image QML Type
显示图像。更多
Import Statement: | import QtQuick |
Inherits: | |
Inherited By: |
属性
- asynchronous : bool
- autoTransform : bool
- cache : bool
- currentFrame : int
- fillMode : enumeration
- frameCount : int
- horizontalAlignment : enumeration
- mipmap : bool
- mirror : bool
- mirrorVertically : bool
(since 6.2)
- paintedHeight : real
- paintedWidth : real
- progress : real
- retainWhileLoading : bool
(since 6.8)
- smooth : bool
- source : url
- sourceClipRect : rect
- sourceSize : size
- status : enumeration
- verticalAlignment : enumeration
详细说明
图像类型显示图像。
图像的来源是使用source 属性指定的 URL。图像可以 Qt 支持的任何标准图像格式提供,包括 PNG 和 JPEG 等位图格式,以及 SVG 等矢量图形格式。如果需要显示动画图片,请使用AnimatedSprite 或AnimatedImage 。
如果未指定width 和height 属性,Image 会自动使用加载图像的大小。默认情况下,指定项目的宽度和高度会导致图像按比例缩放为该尺寸。可以通过设置fillMode 属性来改变这种行为,从而允许拉伸和平铺图像。
可以提供"@nx" high DPI syntax 。
使用示例
下面的示例展示了图像类型的最简单用法。
import QtQuick Image { source: "pics/qtlogo.png" }
压缩纹理文件
如果运行时底层图形 API 的实现支持图像,那么图像也可以压缩纹理文件的形式提供。内容必须是简单的 RGB(A) 格式二维纹理。支持的压缩方案仅受底层驱动程序和 GPU 的限制。支持以下容器文件格式:
PKM
(自 Qt 5.10 起)KTX
(自 Qt 5.11 起)ASTC
(自 Qt 5.13 起)
注意: 纹理文件中图像的垂直方向通常没有明确定义。不同的纹理压缩工具对何时执行输入图像的垂直翻转有不同的默认值和选项。如果纹理文件中的图像出现颠倒,可能需要在资产调整过程中切换翻转。另外,图像元素本身也可以翻转,方法是通过变换属性应用适当的变换,或者更方便的方法是设置mirrorVertically 属性:
transform: [ Translate { y: -myImage.height }, Scale { yScale: -1 } ]
或
mirrorVertically: true
注: 半透明原始图像需要在纹理压缩前进行阿尔法预乘法,以便在Qt Quick 中正确显示。这可以通过以下 ImageMagick 命令行完成:
convert foo.png \( +clone -alpha Extract \) -channel RGB -compose Multiply -composite foo_pm.png
请勿混淆容器格式(如KTX
)和容器文件中存储的实际纹理数据格式。例如,所有平台都支持读取KTX
文件,与运行时使用的 GPU 驱动程序无关。但是,这并不保证运行时支持文件中数据使用的压缩纹理格式。例如,如果 KTX 文件包含格式为ETC2 RGBA8
的压缩数据,而运行时使用的 3D 图形应用程序接口实现不支持ETC2
压缩纹理,则 "图像 "项将不会显示任何内容。
注意: 压缩纹理格式支持不受 Qt 控制,应用程序或设备开发人员应确保压缩纹理数据是以目标环境的适当格式提供的。
不要认为压缩格式支持是某个平台所特有的。它还可能与特定平台上使用的驱动程序和 3D API 实现有关。在实践中,同一平台(如 Windows)上同一供应商针对同一硬件的不同 3D 图形 API(如 Vulkan 和 OpenGL)实现可能会提供不同的压缩纹理格式集。
如果只针对桌面环境(Windows、macOS、Linux),一般建议考虑使用DXTn
/BCn
格式,因为在这些平台上的 Direct 3D、Vulkan、OpenGL 和 Metal 实现中,这些格式往往拥有最广泛的支持。相比之下,在针对移动或嵌入式设备时,ETC2
或ASTC
格式可能是更好的选择,因为这些通常是此类硬件上的 OpenGL ES 实现所支持的格式。
打算在台式机、移动设备和嵌入式硬件上运行的应用程序应仔细规划和设计压缩纹理的使用。依赖单一格式很可能是不够的,因此应用程序很可能需要根据平台的不同来使用适合该平台的压缩纹理格式,或者在某些情况下跳过使用压缩纹理。
自动检测文件扩展名
如果source URL 显示不存在本地文件或资源,图像元素会尝试自动检测文件扩展名。如果可以通过在source URL 上附加任何受支持的图像文件扩展名找到现有文件,则将加载该文件。
文件搜索会首先尝试查找压缩纹理容器文件扩展名。如果搜索不成功,则会尝试使用conventional image file types 的文件扩展名进行搜索。例如,如果搜索成功,则会使用 的文件扩展名进行搜索:
// Assuming the "pics" directory contains the following files: // dog.jpg // cat.png // cat.pkm Image { source: "pics/cat.png" // loads cat.png } Image { source: "pics/dog" // loads dog.jpg } Image { source: "pics/cat" // normally loads cat.pkm, but if no OpenGL, loads cat.png instead. }
该功能有助于在不同的目标平台上部署不同的图像资产文件类型。这对于调整应用程序性能和适应不同图形硬件非常有用。
该功能在 Qt 5.11 中引入。
性能
默认情况下,本地可用图像会立即加载,用户界面会被阻塞,直到加载完成。如果要加载大图像,最好启用asynchronous 属性,在低优先级线程中加载图像。
如果图片是从网络而非本地资源获取的,则会自动以异步方式加载,并根据情况更新progress 和status 属性。
图像在内部缓存和共享,因此如果多个图像项目具有相同的source ,则只会加载一个图像副本。
注意:在 QML 用户界面中,图像往往占用内存最多。建议不构成用户界面一部分的图像通过sourceSize 属性限制其大小。这对于从外部加载或由用户提供的内容尤为重要。
另请参阅 Qt Quick 示例 - 图像元素、QQuickImageProvider 和QImageReader::setAutoDetectImageFormat()。
属性文档
这些属性表示实际绘制图像的大小。在大多数情况下,它与width
和height
相同,但在使用Image.PreserveAspectFit 或Image.PreserveAspectCrop 时,paintedWidth
或paintedHeight
可以小于或大于图像项的width
和height
。
horizontalAlignment : enumeration |
verticalAlignment : enumeration |
设置图像的水平和垂直对齐方式。默认情况下,图像居中对齐。
horizontalAlignment
的有效值是Image.AlignLeft
,Image.AlignRight
和Image.AlignHCenter
。verticalAlignment
的有效值是Image.AlignTop
、Image.AlignBottom
和Image.AlignVCenter
。
currentFrame 是当前可见的框架。默认值为 。如果图像包含多个帧,可以将其设置为 和 之间的一个数字,以显示不同的帧。0
0
frameCount - 1
frameCount 是图像的帧数。大多数图像只有一帧。
asynchronous : bool |
指定本地文件系统上的图像应在单独的线程中异步加载。默认值为 false,这会导致加载图像时用户界面线程阻塞。将asynchronous 设置为 true 比立即显示图像更需要保持用户界面的响应速度。
请注意,此属性只对从本地文件系统读取的图像有效。通过网络资源(如 HTTP)加载的图像总是异步加载的。
autoTransform : bool |
该属性用于确定图像是否应自动应用图像转换元数据(如 EXIF 方向)。
默认情况下,此属性设置为 false。
cache : bool |
指定是否应缓存图像。默认值为 true。在处理大型图片时,将cache 设置为 false 会很有用,这样可以确保在缓存大型图片时不会影响小型 "ui 元素 "图片。
fillMode : enumeration |
设置此属性可定义源图像与项目大小不同时的情况。
常数 | 说明 |
---|---|
Image.Stretch | 图片按比例调整 |
Image.PreserveAspectFit | 图像按统一比例缩放以适应项目,不进行裁剪 |
Image.PreserveAspectCrop | 均匀缩放图像以填充,必要时进行裁剪 |
Image.Tile | 水平和垂直复制图像 |
Image.TileVertically | 水平拉伸图像并垂直平铺 |
Image.TileHorizontally | 图像垂直拉伸并水平平铺 |
Image.Pad | 图像不转换 |
拉伸(默认)Image { width: 130; height: 100 source: "qtlogo.png" } | |
PreserveAspectFitImage { width: 130; height: 100 fillMode: Image.PreserveAspectFit source: "qtlogo.png" } | |
PreserveAspectCropImage { width: 130; height: 100 fillMode: Image.PreserveAspectCrop source: "qtlogo.png" clip: true } | |
平铺Image { width: 120; height: 120 fillMode: Image.Tile horizontalAlignment: Image.AlignLeft verticalAlignment: Image.AlignTop source: "qtlogo.png" } | |
垂直平铺Image { width: 120; height: 120 fillMode: Image.TileVertically verticalAlignment: Image.AlignTop source: "qtlogo.png" } | |
横向平铺Image { width: 120; height: 120 fillMode: Image.TileHorizontally verticalAlignment: Image.AlignLeft source: "qtlogo.png" } |
请注意,clip
默认为false
,这意味着即使 fillMode 设置为PreserveAspectCrop
,项目也可能绘制在其边界矩形之外。
另请参阅 Qt Quick 示例 - 图像元素。
mipmap : bool |
此属性表示图像在缩放或变换时是否使用 mipmap 过滤。
与平滑滤波相比,mipmap 滤波在缩放时能提供更好的视觉质量,但可能要付出性能代价(在初始化图像和渲染时)。
默认情况下,此属性设置为 false。
另请参阅 smooth 。
mirror : bool |
该属性用于确定图像是否应水平反转(实际上是显示镜像图像)。
默认值为 false。
mirrorVertically : bool |
该属性设置图像是否应垂直反转(实际上是显示镜像图像)。
默认值为 false。
此属性在 Qt 6.2 中引入。
retainWhileLoading : bool |
该属性定义了当改变source 属性且异步加载时的行为。当asynchronous 属性设置为true
时,或图像不在本地文件系统上时,就会出现这种情况。
如果retainWhileLoading
是false
(默认值),则会立即丢弃旧图片,并在加载新图片时清空组件。如果设置为true
,旧图像将保留并保持可见,直到新图像就绪。
如果加载新图像需要很长时间,启用该属性可以避免闪烁。但代价是,在加载新图像时,会因双重缓冲而占用一些额外内存。
此属性在 Qt 6.8 中引入。
smooth : bool |
在缩放或变换图像时,该属性决定是否对图像进行平滑过滤。平滑滤波可提供更好的视觉质量,但在某些硬件上可能会更慢。如果图像以自然尺寸显示,该属性不会对视觉或性能产生影响。
默认情况下,此属性设置为 true。
另请参阅 mipmap 。
source : url |
Image 可以处理 Qt 支持的任何图像格式,并从 Qt 支持的任何 URL 方案中加载。
URL 可以是绝对的,也可以是相对于组件 URL 的。
另请参阅 QQuickImageProvider,Compressed Texture Files, 和Automatic Detection of File Extension 。
sourceClipRect : rect |
如果设置了该属性,它将保存要加载的源图像的矩形区域。
sourceClipRect
与sourceSize 属性配合使用,可在只需加载图片的一部分时节省系统资源。
Rectangle { width: ... height: ... Image { anchors.fill: parent source: "reallyBigImage.svg" sourceSize.width: 1024 sourceSize.height: 1024 sourceClipRect: Qt.rect(100, 100, 512, 512) } }
在上面的示例中,我们首先将 SVG 图形概念缩放为 1024x1024,然后从顶部和左侧边缘 100 像素的位置剪切出 512x512 像素的感兴趣区域。因此,sourceSize
决定了比例,但实际输出的图像是 512x512 像素。
有些图像格式可以只渲染指定区域,从而节省 CPU 时间。其他图像格式则需要先加载整个图像,然后剪切到指定区域。
可通过将sourceClipRect
设置为undefined
来清除此属性,以重新加载整个图像。
注: 动态更改此属性会导致图像源被重新加载,如果图像源不在磁盘缓存中,甚至可能从网络重新加载。
注意 :不支持子像素剪切:给定的矩形将传递给QImageReader::setScaledClipRect() 。
sourceSize : size |
该属性保存全帧图像的宽度和高度缩放值。
与缩放图像画幅的width 和height 属性不同,该属性为加载的图像设置了最大存储像素数,这样大型图像就不会占用超出必要的内存。例如,无论图像的width 和height 值是多少,都能确保内存中的图像不大于 1024x1024 像素:
Rectangle { width: ... height: ... Image { anchors.fill: parent source: "reallyBigImage.jpg" sourceSize.width: 1024 sourceSize.height: 1024 } }
如果图像的实际尺寸大于源尺寸,图像将被缩放。如果尺寸中只有一个维度设置为大于 0,则另一个维度将按比例设置,以保持源图像的宽高比。(fillMode 与此无关)。
如果同时设置了 sourceSize.width 和 sourceSize.height,图像将被缩放到指定尺寸内(除非使用了 PreserveAspectCrop 或 PreserveAspectFit,否则图像将被缩放到与裁剪/拟合的最佳尺寸相匹配),同时保持图像的纵横比。缩放后图像的实际尺寸可通过Item::implicitWidth 和Item::implicitHeight 查看。
如果源是本质上可缩放的图像(如 SVG),则无论本质大小如何,该属性都将决定加载图像的大小。请避免动态更改此属性;与图像相比,渲染 SVG 的速度很慢。
如果来源是不可缩放的图像(如 JPEG),加载的图像将不会大于此属性指定的大小。对于某些格式(目前只有 JPEG),整个图像实际上永远不会加载到内存中。
如果sourceClipRect 属性也被设置,sourceSize
将决定缩放比例,但缩放比例将被剪切为剪切矩形的大小。
通过将 sourceSize 设置为undefined
,可以将 sourceSize 清除为图像的自然尺寸。
注意: 动态更改此属性会导致图像源被重新加载,如果图像源不在磁盘缓存中,甚至有可能从网络重新加载。
另请参阅 Qt Quick 示例 - 指针处理程序。
status : enumeration |
该属性显示图像加载的状态。它可以是
常量 | 说明 |
---|---|
Image.Null | 未设置图像 |
Image.Ready | 已加载图像 |
Image.Loading | 正在加载图像 |
Image.Error | 加载图像时发生错误 |
使用此状态提供更新或以某种方式对状态变化做出响应。例如,您可以
- 触发状态更改:
State { name: 'loaded'; when: image.status == Image.Ready }
- 执行
onStatusChanged
信号处理器:Image { id: image onStatusChanged: if (image.status == Image.Ready) console.log('Loaded') }
- 绑定状态值:
Text { text: image.status == Image.Ready ? 'Loaded' : 'Not loaded' }
另请参阅 progress 。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.