一、效果展示

  客户端程序拖拽是一个很常见的需求,对于QWidget程序来说,需要重写如图1这么几个方法,通过重写这几个方法的逻辑,我们就可以控制鼠标拖拽的逻辑,糟糕的是QDrag执行exec后是一个阻塞主事件循环的操作,这个时候除了拖拽界面外,其他界面不能响应鼠标事件。作者之前就有过这么一个需要主界面响应的需求,当时我是重写了如图2所示的接口,来模拟程序拖拽。

图1 QWidget拖拽接口

图2 QWidget鼠标事件

  如图3所示是示例拖拽展示,界面上有3个大的EditText,相互之间可以进行拖拽,将文本移动到新的EditText。

图3 示例拖拽

二、源码分析

  这个示例代码只有2个qml文件,一个是自定义的组件DragAndDropTextItem,另一个是主界面布局。

1、自定义组件DragAndDropTextItem

  自定义组件DragAndDropTextItem根节点是Rectangle,支持鼠标事件,MouseArea捕获整个根节点的是标事件,并设置拖拽对象为draggable组件。DraopArea区域有许多槽函数,这些槽函数会自动被调用,比如onEntered,当鼠标进行的时候被调用,onExited当鼠标离开时被调用,具体代码如下

 import QtQuick 2.2

 Rectangle {
id: item
property string display//导出属性
color: "#EEE"//自定义矩形背景色
Text {
anchors.fill: parent
text: item.display//文本显示绑定导出属性(文本字符串)
wrapMode: Text.WordWrap//文本按字折行
}
DropArea {//拖拽区域
anchors.fill: parent
keys: ["text/plain"]//该字段对应draggable中mimeData
onEntered: {
item.color = "#FCC"
}
onExited: {
item.color = "#EEE"//鼠标拖拽退出时恢复常规背景色
}
onDropped: {//鼠标拖拽完成 释放时触发
item.color = "#EEE"
if (drop.hasText) {//拖拽含有文本字符串
if (drop.proposedAction == Qt.MoveAction || drop.proposedAction == Qt.CopyAction) {
item.display = drop.text//重置当前显示文本
drop.acceptProposedAction()//接受目标动作,停止事件传递
}
}
}
}
//鼠标事件区域,覆盖整个矩形
MouseArea {
id: mouseArea
anchors.fill: parent
drag.target: draggable//拖拽目标指定
}
Item {
id: draggable//
anchors.fill: parent
Drag.active: mouseArea.drag.active
Drag.hotSpot.x: //热点位置
Drag.hotSpot.y:
Drag.mimeData: { "text/plain": item.display }//设置拖拽时内部数据
Drag.dragType: Drag.Automatic//拖拽类型
Drag.onDragStarted: {//拖拽开始
}
Drag.onDragFinished: {//拖拽结束 拖拽操作状态为接受
if (dropAction == Qt.MoveAction) {//如果是移动操作,将显示置空
item.display = ""//清空被拖拽文本框
}
}
} // Item
}

2、主界面布局

  主界面使用了列布局器ColumnLayout,第一行是一个Text文本,显示该应用程序的基本描述信息,接下来3行是3个自定义控件DragAndDropTextItem,代码如下

 import QtQuick 2.2
import QtQuick.Layouts 1.0 Item {
id: root//作用域内 唯一标示
width:
height: ColumnLayout {//列布局器,类似于GridLayout 但是只有一列 anchors.fill: parent
anchors.margins: Text {//第一行显示一串文本
Layout.fillWidth: true
text: "Drag text into, out of, and between the boxes below."
wrapMode: Text.WordWrap
} //支持拖拽自定义控件
DragAndDropTextItem {
Layout.fillWidth: true
height:
display: "Sample Text"
} //支持拖拽自定义控件
DragAndDropTextItem {
Layout.fillWidth: true
height:
display: "Option/ctrl drag to copy instead of move text."
} //支持拖拽自定义控件
DragAndDropTextItem {
Layout.fillWidth: true
height:
display: "Drag out into other applications."
}
}
}

qml demo分析(externaldraganddrop-拖拽)的更多相关文章

  1. qml demo分析(threadedanimation-线程动画)

    一.效果预览 使用过qml的同学都知道,使用qml做动画效果是非常简单的,再也不需要像QWidget那样,自己模拟一个动画,费时又费力,往往还达不到效果.今天我们就来分析下qml的两种动画实现方式,如 ...

  2. qml demo分析(maskedmousearea-异形窗口)

    一.效果展示 如本文的标题所示,这篇文章分析的demo是一个异形窗口,主要展示鼠标在和异形区域交互的使用,效果如图1所示,当鼠标移动到白云或者月亮上时,相应的物体会高亮,当鼠标按下时,物体会有一个放大 ...

  3. qml demo分析(photosurface-图片涅拉)

    阅读qml示例代码已有一小段时间,也陆续的写了一些自己关于qml示例代码的理解,可能由于自己没有大量的qml开发经验,总感觉复杂的ui交互qml处理起来可能会比较棘手,但事实总是会出人意料,今天我们就 ...

  4. qml demo分析(clocks-时钟)

    一.效果展示 效果如图1所示,时钟列表支持鼠标左右拖动,带有黑色背景的是晚上时钟,无黑色背景的是白天时钟 二.源码分析 1.main.cpp文件中只包含了一个宏,该宏的具体解释请看qml 示例中的关键 ...

  5. qml demo分析(maroon-小游戏)

    1.效果展示 这篇文章我还是分析一个qt源码中的qml程序,程序运行效果如下图所示. 图1  游戏开始 图2  游戏中 2.源码分析 这个游戏的源码文件比较多,为了能更清楚的了解整个代码,我先整体分析 ...

  6. qml demo分析(abstractitemmodel-数据分离)

    一.概述 qt5之后qml也可以被用于桌面程序开发,今天我就拿出qt demo中的一个qml示例程序进行分析.这个demo主要是展示了qml数据和展示分离的使用方式,qml只专注于快速高效的绘制界面, ...

  7. qml demo分析(threading-线程任务)

    一.关键类说明 qml内置了WorkerScript组件,该组件有一个source属性,可以加载js文件,含有一个名为message的信号,意味着他有一个默认的onMessage槽函数,除此之外他还有 ...

  8. qml demo分析(text-字体展示)

    上一篇文章分析了一个小游戏,使用qml编写界面+js进行复杂逻辑控制,算是一个比较完整的qml示例代码了,今天就不那么继续变态啦,来看一个简单的字体示例程序吧,该示例代码比较简单,主要是展示了几个简单 ...

  9. qml demo分析(samegame-拼图游戏)

    一.效果展示 相信大家都玩儿过连连看游戏,而且此款游戏也是闲时一款打发时间的趣事,那么接下来我将分析一款类似的游戏,完全使用qml编写界面,复杂逻辑使用js完成.由于此游戏包含4种游戏模式,因此本篇文 ...

随机推荐

  1. 【Python】三个例子教你写代码

    这篇文章包括用Python编写的斐波那契数列,三位数的水仙花数和百钱买百鸡的基础代码: (一)斐波那契数列: ''' def hanshu(n): n_1 = 1 n_2 = 1 m = n sumn ...

  2. Unity3D游戏xlua轻量级热修复框架

    这是什么东西 前阵子刚刚集成xlua到项目,目的只有一个:对线上游戏C#逻辑有Bug的地方执行修复,通过考察了xlua和tolua,最终选择了xlua,原因如下: 1)项目已经到了后期,线上版本迭代了 ...

  3. Mac安装Elasticsearch时提示:No Java runtime present, requesting install.

    没有安装java的童鞋可以先去安装一下,地址:https://www.java.com/zh_CN/ 安装之后还是提示如下错误: ➜ elasticsearch-2.4.3 bin/elasticse ...

  4. 《java.util.concurrent 包源码阅读》11 线程池系列之ThreadPoolExecutor 第一部分

    先来看ThreadPoolExecutor的execute方法,这个方法能体现出一个Task被加入到线程池之后都发生了什么: public void execute(Runnable command) ...

  5. Xshell显示图形化界面

    前言 很久没用过图形化界面了,都忘记怎么使用了.... 依据以往的经验都是由环境变量DISPLAY设置,然后就能连接了,每天也是匆匆忙忙的就过了一天,都不知道干了啥,分配的时间也少,但是一直纠结,进行 ...

  6. Promise原理与实现探究的一种思路

    写在前面 这个文章,展现的是一个实现Promise的思路,以及如何发现和处理问题的情境. 从现有的Promise分析 如果我们想要自己实现一个简单的Promise,那现有规范规定的Promise肯定是 ...

  7. sql关键词的执行顺序

    执行顺序:FROM>ON>JOIN>WHERE>GROUP BY>WITH CUBE or WITH ROLLUP>HAVING>SELECT>DIST ...

  8. WebStorm10 控制台中文乱码解决方案

    工作时发现无论是使用ctrl+F搜索还是查看提交的注释中文都是口,看的本小白十分蛋疼菊紧,所以抽时间找了方法去搞定它. 首先点击左上角的File,选择Setting 然后选择Appearance &a ...

  9. 实现一个websocket常驻进程服务

    由于工作的原因,近期调查了一下mac系统下常驻服务的接收websocket信息和创建进程的方法原理.将具体实现细节记录下来备忘. (一).准备工作 1.安装brew,在终端中输入: ruby -e & ...

  10. 《iOS Human Interface Guidelines》——Multitasking

    多任务处理 多任务处理让人们在屏幕上(以及合适的iPad模式)查看多个app,而且在近期使用的app中高速地切换. 在iOS 9中.人们能够使用多任务处理UI(例如以下所看到的)来选择一个近期使用的a ...