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图形类型一起使用的窗口:

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+Quick实现图片演示器的开发的文章就介绍到这了,更多相关Qt Quick图片演示器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Qt Quick QML-500行代码实现合成大西瓜游戏

    "合成大西瓜"这个游戏在年前很火热,还上过微博热搜,最近便玩了一阵还挺有意思的,所以研究了一下小球碰撞原理,自己亲自手写碰撞算法来实现一个合成大西瓜游戏.并支持任意大小布局,你想玩多大面积,就拖多大面积,只要面积够大,认真玩下去,合100个大西瓜都可以.哈哈~~~ 1.游戏介绍 游戏里面总共有11个水果,两个相同水果的合成一个较大的水果,最终合成一个大西瓜便不能继续合下去了: 然而博主自己写的游戏,自己都合不出一个大西瓜来. 如果看起来很模糊,或者看不到视频,可以直接去https://

  • 基于Qt实现图片播放器的示例代码

    前言:使用qt制作了一个简单的图片播放器,可以播放gif.png等格式图片 先来看看播放器的功能(当然是很简陋的,没有很深入的设计): 1.点击图片列表中图片进行播放. 2.自动播放,播放的图片的间隔时间可以自己设定,时间的单位是秒. 3.自动播放的时候再点击图片列表会停止自动播放,保存当前播放的图片的顺序,再次点击自动播放的时候将从当前开始. 4.自动播放到最后一张图片的时候将会停止自动播放,再次点击自动播放的时候将会从第一张图片开始. 先上图看看具体功能: 说完功能我们聊聊制作思路和使用到的

  • QT+Quick实现自定义组件的示例详解

    目录 按钮 下拉菜单 按钮 添加ZButton.qml import QtQuick 2.14 import QtQuick.Window 2.14 /* 文件名即自定义控件名 使用别名导出属性:相当于函数的变量形参 不同的是导出的属性,调用控件是可以不使用(赋值) */ Rectangle { id: root //导出自定义属性 property alias text: label.text property alias fontSize: label.font.pointSize prop

  • QT quick-Popup弹出窗口自定义的实现

    目录 1.Popup介绍 2.自定义Popup 1.Popup介绍 Popup是一个弹出窗口的控件 它的常用属性如下所示: anchors.centerIn : Object,用来设置居中在谁窗口中. closePolicy : enumeration,设置弹出窗口的关闭策略,默认值为默认值为Popup.CloseOnEscape|Popup.CloseOnPressOutside,取值有: Popup.NoAutoClose : 只有在手动调用close()后,弹出窗口才会关闭(比如加载进度时

  • windows下安装QT及visual studio 2017搭建开发环境

    1.环境搭建 这里并不是说qt必须要和visual studio结合使用,不过用习惯了visual studio开发,继续使用可节省开发时间,并大大提供便利性. 关于安装过程这里不再详细赘述,软件下载链接如下: visual studio:https://www.visualstudio.com/zh-hans/downloads/ QT:http://download.qt.io/archive/qt/(这里推荐安装最新的,原因是vs2017不支持一些老版本的makefile文件生成,这个在文

  • 使用JSX 建立组件 Parser(解析器)开发的示例

    目录 JSX 环境搭建 建立项目 初始化 NPM 安装 webpack 安装 Babel 配置 webpack 安装 Babel-loader 模式配置 引入 JSX JSX 基本用法 JSX 基础原理 实现 createElement 函数 实现自定义标签 这里我们一起从 0 开始搭建一个组件系统.首先通过上一篇<前端组件化基础知识>中知道,一个组件可以通过 Markup 和 JavaScript 访问的一个环境. 所以我们的第一步就是建立一个可以使用 markup 的环境.这里我们会学习使

  • Qt简单实现密码器控件

    本文实例为大家分享了Qt自定义一个密码器控件的简单实现代码,供大家参考,具体内容如下 实现构思: 密码器的功能可以看成是计算器和登陆界面的组合,所以在实现功能的过程中借鉴了大神的计算器的实现代码和登陆界面实现的代码. 实现的效果: 关于密码器控件的不足: 窗口的标题栏不够漂亮,但是由于对时间长度和任务进度的权衡,下次一定进行重绘. 代码思路: 由于我司不用样式表,所以背景由贴图函数完成.在widget中添加按钮控件和文本编辑控件.使用布局函数进行布局,在加上一些简单的逻辑处理功能即可. 首先创建

  • Qt Quick Designer灰色或者禁用的解决

    今天安装qt6的时候发现一个问题,下面就来解决一下,具体如下: 目前新版本自qt6开始,已经默认禁用了Qt Quick Designer,qt未来将ui图像化重任要交给Qt Design Studio了,目地就是做ui设计的不用安装creator,目前过渡阶段,可以从插件中心启用. 到此这篇关于Qt Quick Designer灰色或者禁用的解决的文章就介绍到这了,更多相关Qt Quick Designer禁用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

  • Android 音乐播放器的开发实例详解

    本文将引导大家做一个音乐播放器,在做这个Android开发实例的过程中,能够帮助大家进一步熟悉和掌握学过的ListView和其他一些组件.为了有更好的学习效果,其中很多功能我们手动实现,例如音乐播放的快进快退等. 先欣赏下本实例完成后运行的界面效果: 首先我们建立项目,我使用的SDK是Android2.2的,然后在XML中进行布局. 上方是一个ListView用来显示我们的音乐列表,中间是一个SeekBar可以拖动当前音乐的播放进度,之所以用SeekBar而不用ProgressBar是因为我们需

  • 实例解析iOS中音乐播放器应用开发的基本要点

    一.调整项目的结构,导入必要的素材 调整后的项目结构如下: 二.新建两个控制器 (1)新建一个控制器,用于展示音乐文件列表界面,其继承自UITableViewController (2)新建一个控制器,用于展示播放界面,其继承自UIViewController (3)在storyboard中,把之前的控制器删除,换上一个导航控制器,设置tableViewController与之前新建的控制器类进行关联 三.音乐文件列表控制器中基本界面的搭建 (1)新建一个音乐文件的模型 根据plist文件建立模

  • Qt 使用Poppler实现pdf阅读器的示例代码

    开发环境 Qt5.5.1.Qt Creator 3.5.1 Qt实现pdf阅读器和MFC实现pdf阅读器,其实原理都是差不多的. 需要用到Poppler开源库,下载地址如下 https://poppler.freedesktop.org/ 如果只是要在window的gcc下运行的话,可以下载已经编译好的库 https://sourceforge.net/projects/poppler-win32/ 注意:这个是MinGW版本的Qt,也就是运行在GCC环境下的库,里面只包含 *.dll 和 *.

  • C#开发可播放摄像头及任意格式视频的播放器

    前言 本文主要讲述,在WPF中,借助Vlc.DotNet调用VLC类库,实现视频播功能,下面我们先来做开发前的准备工作. 准备工作 首先,我们创建一个项目WpfVLC,然后,进入Neget搜索Vlc.DotNet,得到如下界面: 我们选择Vlc.DotNet.Wpf,点击安装(这里我已经安装了,所以图中显示为卸载). 然后,我们去VLC官网,下载VLC播放器. VLC官网:http://www.videolan.org/ 因为我的电脑是64位的,所以我下载64位的VLC版本,如下图: 下载完成后

  • Qt6.0开发环境搭建步骤(图文)

    一.简单介绍 2020/12/08 日,星期二,Qt6 正式发布了,这将是一个里程碑式新版本,这是新主要版本的第一个版本,标志着Qt的重要里程碑. 1.Qt的核心价值 它具有跨平台的特性,允许用户使用一种技术并从一个代码库将其应用程序部署到所有台式机,移动和嵌入式平台从低端,单用途设备到高端复杂台式机应用程序或连接系统的可扩展性其世界一流的API,工具和文档,简化了应用程序和设备的创建它的可维护性,稳定性和兼容性,使用户可以轻松维护大型代码库拥有超过150万用户的大型开发者生态系统 2.核心重点

随机推荐