QML 图像变换(缩放、平移、旋转)

目录

    • 引言
    • 相关阅读
    • 基础知识
    • 工程结构
    • 核心代码解析
      • 示例1:图像缩放(ImageScale.qml)
        • 代码说明
        • 运行效果
      • 示例2:图像平移(ImageTransform.qml)
        • 代码说明
        • 运行效果
      • 示例3:图像旋转(ImageRotation.qml)
        • 代码说明
        • 运行效果
    • 总结
    • 下载链接

引言

本文通过一个Qt Quick项目实例,演示如何使用QML实现常见的图像变换效果。项目包含缩放、旋转和平移三种基础变换操作。

相关阅读

  • Transform文档:https://doc.qt.io/qt-6/qml-qtquick-transform.html

基础知识

Qt Quick的Transform类型提供多种图形变换能力:

  1. Rotation:实现旋转变换,通过angle属性控制旋转角度
  2. Scale:控制缩放比例,支持x/y轴独立缩放
  3. Translate:实现平面位移变换,通过x/y属性设置偏移量

工程结构

qml_image_transform/
├── CMakeLists.txt        # 项目构建文件
├── Main.qml             # 主界面
├── ImageScale.qml       # 缩放示例
├── ImageRotation.qml    # 旋转示例
├── ImageTransform.qml   # 平移示例
├── images.qrc           # 资源文件
└── images/              # 图片资源目录

核心代码解析

示例1:图像缩放(ImageScale.qml)

import QtQuick
import QtQuick.ControlsItem {width: 400height: 400Image {id: imagesource: "qrc:/images/deepseek-logo.png"width: 200height: 200anchors.centerIn: parent// 缩放控制property real imageScale: 1.0scale: imageScale// 缩放动画Behavior on imageScale {NumberAnimation { duration: 200 }}}// 添加缩放控制滑块Slider {anchors.bottom: parent.bottomwidth: parent.widthfrom: 0.1to: 3.0value: 1.0onValueChanged: image.imageScale = value}
}

这段代码整体实现了一个简单的图片查看器界面,用户可以通过拖动滑块来动态调整图片的缩放比例,并且缩放过程会有平滑的动画效果。

代码说明

缩放控制:

  • 定义了 imageScale 属性控制缩放比例,默认值为 1.0。
  • 将图片的 scale 属性绑定到 imageScale,使其随 imageScale 变化而缩放。
  • 使用 BehaviorNumberAnimation 实现缩放动画效果。

缩放控制滑块

  • Slider 控件用于调整缩放比例,设置了取值范围和初始值。
  • 通过 onValueChanged 将滑块的值赋给 imageScale,实现动态缩放控制。
运行效果

请添加图片描述


示例2:图像平移(ImageTransform.qml)

import QtQuick
import QtQuick.ControlsItem {width: 400height: 400Image {id: imagesource: "qrc:/images/deepseek-logo.png"width: 200height: 200anchors.centerIn: parenttransform: Translate {id: translateTransformx: 0y: 0}}// 使用鼠标拖拽实现平移MouseArea {anchors.fill: parentproperty point lastPosonPressed: lastPos = Qt.point(mouse.x, mouse.y)onPositionChanged: {translateTransform.x += mouse.x - lastPos.xtranslateTransform.y += mouse.y - lastPos.ylastPos = Qt.point(mouse.x, mouse.y)}}
}
代码说明

图片元素:

  • Image 用于显示图片,设置了图片源、宽高,并通过锚点居中显示在 Item 中。
  • 通过 transform 属性添加了一个 Translate 变换(translateTransform),用于控制图片的位移,初始时 x 和 y 方向的位移均为 0。

鼠标拖拽平移:

  • Item 中添加了一个 MouseArea,覆盖整个 Item 的区域。
  • MouseArea 有一个 lastPos 属性,用于存储鼠标按下的位置。
  • onPressed 信号处理程序中,将鼠标按下的位置赋给 lastPos
  • onPositionChanged 信号处理程序中,计算鼠标位置的变化量,然后更新 translateTransform 的 x 和 y 值,从而实现图片的平移。
运行效果

请添加图片描述


示例3:图像旋转(ImageRotation.qml)

import QtQuick
import QtQuick.ControlsItem {width: 400height: 400Image {id: imagesource: "qrc:/images/deepseek-logo.png"width: 200height: 200anchors.centerIn: parent// 旋转控制property real imageRotation: 0rotation: imageRotation// 旋转动画Behavior on rotation {NumberAnimation { duration: 200 }}}// 添加旋转控制滑块Slider {anchors.bottom: parent.bottomwidth: parent.widthfrom: 0to: 360value: 0onValueChanged: image.imageRotation = value}
}
代码说明

图片元素:

  • Image 用于显示图片,设置了图片源、宽高,并通过锚点居中显示在 Item 中。
  • 定义了 imageRotation 属性控制图片的旋转角度,默认值为 0。
  • 将图片的 rotation 属性绑定到 imageRotation,使其随 imageRotation 变化而旋转。
  • 使用 BehaviorNumberAnimation 实现旋转动画效果。

旋转控制滑块:

  • Item 中添加了一个 Slider,用于控制图片的旋转角度。
  • Slider 的取值范围设置为 0 到 360,初始值为 0。
  • 通过 onValueChanged 将滑块的值赋给图片的 imageRotation 属性,实现动态旋转控制。
运行效果

请添加图片描述


总结

本文实现了3个示例,分别是:

  • 示例1:图片缩放(通过定义 imageScale 属性控制图片缩放比例,利用 BehaviorNumberAnimation 实现缩放动画效果。滑块的值变化时,动态调整图片的缩放比例。)
  • 示例2:图片平移(在图片上添加 Translate 变换,通过鼠标按下的位置和移动的位置差,动态更新图片的平移量,实现拖拽平移效果。)
  • 示例3:图片旋转(定义 imageRotation 属性控制图片旋转角度,利用 BehaviorNumberAnimation 实现旋转动画效果。滑块的值变化时,动态调整图片的旋转角度。)

下载链接

工程下载地址:GitCode -> QML Image Transform

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/82380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 系统命令使用指南1

适用于 Red Hat / CentOS / Rocky Linux 等系统的基本初始化配置操作。 🔒 1. 关闭 SELinux(临时生效) setenforce 0⚠️ 注意:此命令仅临时关闭 SELinux,重启后可能恢复。要永久关闭,请修改 /etc/selinux…

1.2.1 Linux音频系统发展历程简介

Linux音频系统的发展经历了从最初的简单驱动到今天多层次、模块化音频架构。简要梳理其主要历程: 早期的OSS(Open Sound System) 在90年代及2000年代初,Linux主要使用OSS来支持音频。OSS直接为硬件设备(如声卡&#…

【Linux操作系统】第一弹——Linux基础篇

文章目录 💡 一. Linux的基本常识🪔 1.1 linux网络连接三种方式🪔1.2 虚拟机的克隆🪔1.3 虚拟机的快照🪔1.4 虚拟机的迁移和删除🪔1.5 vmtools工具 💡二. Linux的目录结构🪔2.1 Linu…

STM32printf重定向到串口含armcc和gcc两种方案

STM32串口重定向:MDK与GCC环境下需重写的函数差异 在嵌入式开发中,尤其是使用 STM32系列微控制器 的项目中,调试信息的输出是不可或缺的一部分。为了方便调试,开发者通常会选择将 printf 等标准输出函数通过 UART 串口发送到 PC …

C++ 文本读写与二进制读写的底层机制

1.文件的打开方式 1.文本打开 在windows中,写入时会将\n换成\r\n,读出时\r\n会读出\n linux对\n读写不做处理 2.二进制打开 对\n读写不做处理 2.文本读写 1.数据要先变成字符串再写进缓冲区 2.字符串直接写进缓冲区就是 3.c对文本读写的支持 istream/ostream中重载了对…

02 mysql 管理(Windows版)

一、启动及关闭 MySQL 服务器 1.1 通过 “服务” 管理工具 winr打开运行,输入services.msc 找到MySQL80,这个是我们在安装mysql的时候给的服务的名称,具体见文章mysql 安装 右键选择启动或者停止。 1.2 通过命令提示符 1.2.1 关闭命令…

Elasticsearch知识汇总之 ElasticSearch高可用方案

六 ElasticSearch高可用方案 6.1 高可用架构 请求协调节点根据负载均衡,转发给主分片节点,主分片同步复制给从节点,主从节点都写入完成返回客户端请求成功。对于读请求,协调负载到任意节点数据节点,数据节点把各自符合…

H5 移动端适配最佳实践落地指南。

文章目录 前言一、为什么需要移动端适配?二、核心适配方案1. 视口(Viewport)设置2. 三种适配方案 (仅供参考)(1)rem 适配方案(2)vw/vh 适配方案(3&#xff09…

MySQL初阶:数据库约束和表的设计

数据库约束 数据库约束是针对数据库中的表中的数据进行施加规则和条件,用于确保数据的准确性和可靠性。 数据库约束类型 1)not null 非空类型 :指定非空类型的列不能存储null,如果插入的数据是null便会报错。 2)de…

LVGL- 按钮矩阵控件

1 按钮矩阵控件 lv_btnmatrix 是 LVGL(Light and Versatile Graphics Library) v8 中提供的一个非常实用的控件,用于创建带有多个按钮的矩阵布局。它常用于实现虚拟键盘、数字键盘、操作面板、选择菜单等场景,特别适用于嵌入式设…

excel 批量导出图片并指定命名

一、开发环境 打开excel文件中的宏编辑器和JS代码调试 工具-》开发工具-》WPS宏编辑器 左边是工程区,当打开多个excel时会有多个,要注意不要把代码写到其他工作簿去了 右边是代码区 二、编写代码 宏是js语言,因此变量或者方法可以网上搜…

yolov5基础--yolov5源码阅读(common.py)

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 博主简介:努力学习的22级本科生一枚 🌟​;探索AI算法,C,go语言的世界;在迷茫中寻找光芒…

5.0.5 变换(旋转、缩放、扭曲)

WPF变换可以产生特殊效果,如平移、旋转、扭曲。 变换类 描述TranslateTransform沿着X轴和Y轴平移ScaleTransform 沿着定义的中心点缩放RotateTransform沿着定义的中心点旋转SkewTransform 扭曲元素MatrixTransfrom提供3x3矩阵,用于定义一个自定义变换 1…

如何设置内网映射端口到外网访问?哪些软件可以进行端口映射?

大多数时候我们所使用的服务器都是在内网搭建的,而且内网是可以访问外网的,但外网是没法直接访问内网IP和端口服务的。也就是说外网无法直接访问到内网的网络地址,需要大家去搭建一个内外网互通的桥梁,把内网服务器指定端口映射到…

养生:塑造健康生活的良方

养生是一场贯穿生活的自我关爱行动,从饮食、运动、睡眠到心态调节,每一个环节都对健康有着深远影响。以下为你带来全面且实用的养生策略。 饮食养生:科学搭配,呵护肠胃 合理规划三餐,遵循 “早营养、午均衡、晚清淡”…

YOLOv12云端GPU谷歌免费版训练模型

1.效果 2.打开 https://colab.research.google.com/?utm_sourcescs-index 3.上传代码 4.解压 !unzip /content/yolov12-main.zip -d /content/yolov12-main 5.进入yolov12-main目录 %cd /content/yolov12-main/yolov12-main 6.安装依赖库 !pip install -r requirements.…

机器人手臂的坐标变换:一步步计算齐次矩阵过程 [特殊字符]

大家好!今天我们来学习如何计算机器人手臂的坐标变换。别担心,我会用最简单的方式解释这个过程,就像搭积木一样简单! 一、理解问题 我们有一个机器人手臂,由多个关节组成。每个关节都有自己的坐标系,我们需要计算从世界坐标系(W)到末端执行器(P₃)的完整变换。 二、已…

CSS中的@import指令

一、什么是import指令&#xff1f; import 是CSS提供的一种引入外部样式表的方式&#xff0c;允许开发者在CSS文件中引入其他CSS文件&#xff0c;或者在HTML的<style>标签中引入外部样式。与常见的<link>标签相比&#xff0c;import 提供了一种更“CSS原生”的样式…

[学成在线]23-面试题总结

1. 详细说说你的项目吧 从以下几个方面进行项目介绍: 项目的背景&#xff0c;包括: 是自研还是外包、什么业务、服务的客户群是谁、谁去运营等问题。项目的业务流程项目的功能模块项目的技术架构个人工作职责个人负责模块的详细说明&#xff0c;包括模块的设计&#xff0c;所…

C++编程语言:标准库:标准库概观(Bjarne Stroustrup)

第30章 标准库概观(Standard-Library Overview) 目录 30.1 引言 30.1.1 标准库设施 30.1.2 设计约束 30.1.3 描述风格 30.2 头文件 30.3 语言支持 30.3.1 对initializer_list的支持 30.3.2 对范围for的支持 30.4 异常处理 30.4.1 异常 30.4.1…