提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|使用教程|编辑:鲍佳佳|2021-02-20 10:12:56.480|阅读 246 次
概述:一个适用于触摸设备的QML应用程序,它使用一个带有FolderListModel的Repeater来访问文件夹中的内容,以及一个包含MouseArea的PinchArea来处理获取内容上的捏合手势。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
相关链接:
Qt相关组件:
Qt快速演示-Photo Surface
一个适用于触摸设备的QML应用程序,它使用一个带有FolderListModel的Repeater来访问文件夹中的内容,以及一个包含MouseArea的PinchArea来处理获取内容上的捏合手势。
Photo Surface演示了如何使用带有FolderListModel和FileDialog的Repeater来访问用户选择的文件夹中的图像,以及如何使用包含MouseArea的PinchArea处理同一项目内的拖动,旋转和收缩缩放。
所有应用程序代码都包含在一个QML文件photosurface.qml中。内联JavaScript代码用于在照片表面上放置,旋转和缩放图像。
运行示例
要从Qt Creator运行示例,请打开“欢迎”模式,然后从“示例”中选择示例。
创建主窗口
要为Photo Surface应用创建主窗口,我们使用Window QML类型作为根项目。它会自动设置与Qt Quick图形类型一起使用的窗口:
Window { id: root visible: true width: 1024; height: 600 color: "black" property int highestZ: 0 property real defaultSize: 200 property var currentFrame: undefined
要使用Window类型,我们必须导入:
import QtQuick.Window 2.1
访问文件夹内容
我们将Repeater QML类型与FolderListModel一起使用,以显示位于文件夹中的GIF,JPG和PNG图像:
Repeater { model: FolderListModel { id: folderModel objectName: "folderModel" showDirs: false nameFilters: imageNameFilters }
要使用FolderListModel类型,我们必须导入:
import Qt.labs.folderlistmodel 1.0
我们使用FileDialog使用户能够选择包含图像的文件夹:
FileDialog { id: fileDialog title: "Choose a folder with some images" selectFolder: true folder: picturesLocation onAccepted: folderModel.folder = fileUrl + "/" }
要使用FileDialog类型,我们必须导入Qt快速对话框:
import QtQuick.Dialogs 1.0
fileDialog.open()当应用启动时,我们使用该功能打开文件对话框:
Component.onCompleted: fileDialog.open()
用户还可以单击文件对话框图标以打开文件对话框。我们使用Image QML类型来显示图标。在Image类型内部,我们使用带有信号处理程序的MouseAreaonClicked来调用该fileDialog.open()函数:
在照片表面上显示图像
我们使用Rectangle作为Repeater的委托,为FolderListModel在选定文件夹中找到的每个图像提供框架。我们使用JavaScriptMath()方法将框架随机放置在照片表面上,并以任意角度旋转它们,以及缩放图像:
Image { anchors.top: parent.top anchors.left: parent.left anchors.margins: 10 source: "resources/folder.png" MouseArea { anchors.fill: parent anchors.margins: -10 onClicked: fileDialog.open() hoverEnabled: true onPositionChanged: { tooltip.visible = false hoverTimer.start() } onExited: { tooltip.visible = false hoverTimer.stop() }
处理捏合手势
我们在相框中使用一个包含MouseArea的PinchArea来处理相框的拖动、旋转和捏合缩放。Rectangle { id: photoFrame width: image.width * (1 + 0.10 * image.height / image.width) height: image.height * 1.10 scale: defaultSize / Math.max(image.sourceSize.width, image.sourceSize.height) Behavior on scale { NumberAnimation { duration: 200 } } Behavior on x { NumberAnimation { duration: 200 } } Behavior on y { NumberAnimation { duration: 200 } } border.color: "black" border.width: 2 smooth: true antialiasing: true Component.onCompleted: { x = Math.random() * root.width - width / 2 y = Math.random() * root.height - height / 2 rotation = Math.random() * 13 - 6 }
我们使用pinchgroup属性来控制相框对捏合手势的反应。该pinch.target组photoFrame的项目来操作。旋转属性指定可以在所有角度旋转框架,而缩放属性指定可以在0.1和之间缩放它们10。
在MouseArea的onPressed信号处理程序中,我们通过增加其z属性的值来将所选相框提升到顶部。根项存储最上面一帧的z值。在onEntered信号处理程序中控制相框的边框颜色以突出显示所选图像:
PinchArea { anchors.fill: parent pinch.target: photoFrame pinch.minimumRotation: -360 pinch.maximumRotation: 360 pinch.minimumScale: 0.1 pinch.maximumScale: 10 pinch.dragAxis: Pinch.XAndYAxis onPinchStarted: setFrameColor();
为了使您能够在桌面上测试示例,我们使用MouseArea的onWheel信号处理程序通过使用鼠标来模拟捏手势:
MouseArea { id: dragArea hoverEnabled: true anchors.fill: parent drag.target: photoFrame scrollGestureEnabled: false // 2-finger-flick gesture should pass through to the Flickable onPressed: { photoFrame.z = ++root.highestZ; parent.setFrameColor(); } onEntered: parent.setFrameColor();
onWheel信号处理程序在响应鼠标滚轮手势时被调用。使用垂直滚轮来缩放和Ctrl键以及垂直滚轮来旋转帧。如果鼠标有一个水平滚轮,则使用它来旋转帧。
onWheel: { if (wheel.modifiers & Qt.ControlModifier) { photoFrame.rotation += wheel.angleDelta.y / 120 * 5; if (Math.abs(photoFrame.rotation) < 4) photoFrame.rotation = 0; } else { photoFrame.rotation += wheel.angleDelta.x / 120; if (Math.abs(photoFrame.rotation) < 0.6) photoFrame.rotation = 0; var scaleBefore = photoFrame.scale; photoFrame.scale += photoFrame.scale * wheel.angleDelta.y / 120 / 10; } }
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn
文章转载自:本文探讨 SQL Server 中 NULL 和空值之间的区别,并讨论如何有效地处理它们。
Unity 是一款功能极其丰富的游戏引擎,允许开发人员将各种媒体集成到他们的项目中。但是,它缺少最令人兴奋的功能之一 - 将 Web 内容(例如 HTML、CSS 和 JavaScript)直接渲染到 3D 场景中的纹理上的能力。在本文中,我们将介绍如何使用 DotNetBrowser 在 Unity3D 中将 Web 内容渲染为纹理。
DevExpress v24.2帮助文档正式发布上线了,请按版本按需下载~
本教程将向您展示如何用MyEclipse构建一个Web项目,欢迎下载最新版IDE体验!
一个跨平台的C++图形用户界面应用程序开发框架。
QtitanRibbon专业全面 & 实现Qt技术的跨平台Ribbon UI组件
QtitanChart性能优异的跨平台Qt类图表组件
QtitanDataGrid一个独特的Qt开发框架产品,吸收了Delphi、C++以及其他语言的优点
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@pclwef.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢