目录介绍运行示例创建主窗口访问文件夹内容在照片表面上显示图像处理捏合手势介绍 一个适用于触摸设备的QML应用程序,它使用一个带有FolderListModel的Repeater来访问
一个适用于触摸设备的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;
}
}
Qt相关组件:
到此这篇关于Qt+Quick实现图片演示器的开发的文章就介绍到这了,更多相关Qt Quick图片演示器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: Qt+Quick实现图片演示器的开发
本文链接: https://lsjlt.com/news/176631.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0