Qt quick案例:图片演示器开发

一个适用于触摸设备的QML应用程序,它使用一个带有FolderListModel的Repeater来访问文件夹中的内容,以及一个包含MouseArea的PinchArea来处理获取内容上的捏合手势。

Photo Surface

演示了如何使用带有FolderListModel和FileDialog的Repeater来访问用户选择的文件夹中的图像,以及如何使用包含MouseArea的PinchArea处理同一项目内的拖动,旋转和收缩缩放。

所有应用程序代码都包含在一个QML文件photosurface.qml中。内联JavaScript代码用于在照片表面上放置,旋转和缩放图像。

运行示例

要从Qt Creator运行示例,请打开“欢迎”模式,然后从“示例”中选择示例

创建主窗口

要为Photo Surface应用创建主窗口,我们使用Window QML类型作为根项目。它会自动设置与Qt Quick图形类型一起使用的窗口:

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,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相关组件:

  • QtitanRibbon:**** 遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,致力于为Windows、Linux和Mac OS X提供功能完整的Ribbon组件。
  • **QtitanChart :**是一个C ++库,代表一组控件,这些控件使您可以快速地为应用程序提供漂亮而丰富的图表。并且支持所有主要的桌面操作系统。
  • **QtitanDataGrid :**这个Qt数据网格组件使用纯C++创建,运行速度极快,处理大数据和超大数据集的效果突出。QtitanDataGrid完全集成了QtDesigner,因而极易适应其他相似的开发环境,保证100%兼容Qt GUI。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值