ClipBoard

存在的意义

  • 进程间数据共享。

方式

  • Drag And Drop: clipBoard的拖曳方式

  • app's ClipBoard

缺点

  • 没有权限管理

在Model View中实现Drag And Drop

  • 重写

      QStringList QAbstractItemModel::mimeTypes() const

默认存在的mime类型是 application/x-qabstractitemmodeldatalist 。

  • 重写

      QMimeData * QAbstractItemModel::mimeData(const QModelIndexList & indexes) const

序列化选中的 item, 然后把数据调用 QMimeData::setData 保存在相应的类型中

  • 重写

      bool QAbstractItemModel::dropMimeData(const QMimeData * data, Qt::DropAction action, int row, int column, const QModelIndex & parent)

处理action 对应操作的数据,为真表示处理完毕, 为假表示 处理未完成?。 该model应该完成与行列相关的操作。 例如Tree的父子关系更新。

在 QWidget 中实现 Drag And Drop

  • QWidget 自身有以下几个事件需要被实现。

      void QLineEdit::dragEnterEvent(QDragEnterEvent * e)
    void QLineEdit::dragLeaveEvent(QDragLeaveEvent * e)
    void QLineEdit::dragMoveEvent(QDragMoveEvent * e)
    void QLineEdit::dropEvent(QDropEvent * e)
    • 当鼠标处于Drag状态并且进入Widget时, 发生 dragEnterEvent
    • 当鼠标处于Drag状态并且离开Widget时, 发生 dragLeaveEvent
    • 当鼠标处于Drag状态并且发生如下动作时: 进入Widget, 在Widget内部移动, modifier key 按下,发生dragMoveEvent
    • 当鼠标处于Drag状态并且放置在Widget内时, 发生 dropEvent

自定义 Drag Drop 类

  • QStyleHints 一个只读类, 从QGuiApplication获取,提供了系统GUI的一些参数,

    • QStyleHints::startDragTime() 定义了触发Drag所需要的鼠标按压时间
    • QStyleHints::startDragDistance() 定义了触发Drag 所需要的鼠标按压移动距离
    • QStyleHints::startDragVelocity() 定义了触发Drag 所需要的鼠标按压移动速度 (pixels/second)
  • QGuiApplication 属于QtGui模块,它为非Widgets类型Gui提供系统参数和控制流, 目前知道的应用场景是 OpenGL方案和 QML 方案; 众所周知,QML的渲染引擎是基于OpenGL, 所以可以预测,QGuiApplication 应该是提供了从 窗口类型到 OpenGL 的接口, 提供 clipboard。

  • QApplication 属于QtWidgets模块, 它为QtWidgets 提供了一些易用函数。提供 clipboard。

  • QDrag 用于更详细的定制 Drag 事件。包括定义一个表示数据的图标,鼠标样式,热点(不理解是什么概念) 等等。通常不用这样做。

使用QClipBoard

  • 提供了窗口系统剪贴板的简易类。操作简单,概念清晰。

QMimeData

  • 整个copy-paste 方案中最重要的环节。

  • 在剪贴板、DragEvent、DropEvent中都可以获取到一个QMimeData类。

  • 简单使用的话,在Drag 发生或者 copy时setText, 或者setData、setHtml等等, 然后在Drop事件发生或者paste时, 调用 QMimeData 的 hasHtml、 hasImage、 hasText等等。

  • 如果需要自定义格式,使用 MIME_type类型语法:

      media-type=type "/" subtype *( ";" parameter )

媒体类型(type)与子类型(subtype)组成了MIME,它们之间使用反斜杠/分割,其中type可取值为:application audio example image message model multipart text video,subtype是某种类型的唯一标识符,比如:css gif xml等。

QMimeType 代表了一个文件类型(或者数据格式)的表示方式。在linux下, 程序通过读取XDG_DATA_DIRS(/usr/share/mime/packages/)下面的xml文件来获取mime类型。 在windows下,是通过扩展名表示文件类型的。 一个表示mimetype的xml文件可以如下表示

	<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
<mime-type type="application/vnd.nokia.qt.qmakeprofile">
<comment xml:lang="en">Qt qmake Profile</comment>
<glob pattern="*.pro" weight="50"/>
</mime-type>
</mime-info>

windows下的mime type 写在注册表中,win+R 打开 regedit , 展开HKEY_CLASSES_ROOT分支,这个里面的带点开头的子文件夹就是。 HKEY_CLASSES_ROOT.gz, Default 表示相关应用。Content Type 表示mime类型。

QMimeDatabase 维持了一个 mimetype的数据库, 它可能是来自系统的 database(linux), 但是大多数情况下, 操作系统并不提供 mimetype database,Qt 自身有一个。

	QMimeDatabase db;
QMimeType mime = db.mimeTypeForFile(fileName);
if (mime.inherits("text/plain")) {
// The file is plain text, we can display it in a QTextEdit
}

Qt-剪切板的更多相关文章

  1. 浏览器中用JavaScript获取剪切板中的文件

    本文转自我的个人网站  , 原文地址:http://www.zoucz.com/blog/2016/01/29/get-file-from-clipboard/  ,欢迎前往交流讨论 在网页上编辑内容 ...

  2. 监视 Windows 剪切板

    一.先看代码 import win32con,win32gui import win32clipboard as cb class MyWindow(): def __init__(self): #注 ...

  3. WPF剪切板问题-OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN))

    WPF剪切板问题-OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN))       最近碰到一个问题,需要弄个小工具来解决.刚好接触到WPF, ...

  4. 小菜学习Winform(六)剪切板和拖放复制

    前言 在做winform项目的时候有时候会用到复制粘贴,在.net中提供了Clipboard类来操作剪切板,我们来看下. clipbrd.exe clipbrd是系统剪切板程序,但是在vista及以上 ...

  5. Python访问剪切板

    剪切板访问工具 ----pyperclip he purpose of Pyperclip is to provide a cross-platform Python module for copyi ...

  6. JS从剪切板里粘贴图片

    功能需求:在网页中,Ctrl+V,把系统剪切板的图片(比如QQ截图)进行粘贴.显示.上传...,提高用户体验. 参考链接:https://ruby-china.org/topics/17266 git ...

  7. VBS操作剪切板

    '设置剪切板的内容 Dim Form, TextBox Set Form = CreateObject("Forms.Form.1") Set TextBox = Form.Con ...

  8. 重新想象 Windows 8 Store Apps (40) - 剪切板: 复制/粘贴文本, html, 图片, 文件

    [源码下载] 重新想象 Windows 8 Store Apps (40) - 剪切板: 复制/粘贴文本, html, 图片, 文件 作者:webabcd 介绍重新想象 Windows 8 Store ...

  9. 在多浏览器使用JS复制内容到剪切板,无需插件

    最近在学习DHTMLX,下载了一些JS源码,使用谷歌浏览器,在学习dhtmlxGrid部分进行复制表格内容时,发现,在线版的可以复制成功,而本地的不可以复制,报类似访问剪切板错误,经查找原因,原来是谷 ...

  10. Javascript操作剪切板数据(支持IE、Chrome、360、搜狗),亲测!

    clipboarddata只能在IE浏览器中使用,在chrome下会提示对象未定义!以下的方法支持IE.Chrome.360.搜狗等浏览器,其它浏览器还未验证. <!DOCTYPE html&g ...

随机推荐

  1. Android项目---快递查询

    快递查询,快递100上有更多接口信息 1.快递查询的接口是 快递公司的code值+快递单号 进行的网络查询.第一步,怎么将快递公司的名字转换成code值,传递给接口.下面是快递公司以及对应的code值 ...

  2. 用javascript实现2048的小游戏

    前段时间,看了一个视频,用javascript实现的2048小游戏,发现不难,都是一些基出的语法和简单逻辑. 整个2048游戏没有很多的数据,所有,实现起来还是很有成就感的. 先上图,简直就和原版游戏 ...

  3. Restful WebApi开发实践

    随笔分类 - Restful WebApi开发实践   C#对WebApi数据操作 摘要: ## 目标简化并统一程序获取WebApi对应实体数据的过程,方便对实体进行扩充.原理就是数据服务使用反射发现 ...

  4. CentOS 6.4源码编译安装httpd并启动测试

    今天来总结一下在Linux中软件安装,通常我们应该知道,安装软件有两种方法:一种是软件包的安装,也就是rpm包的安装,就是指这些软件包都是 已经编译好的二进制rpm包,我们通过rpm安装工具和yum安 ...

  5. Toad for Oracle的安装

    分享一下Oracle 10gToad for Oracle的安装步骤   三年前用过Oracle,单纯的“用过”,主要就是说对数据库的一些操作,还不包含创建一些存储过程之类的,所以对Oracle仅仅只 ...

  6. .NET MVC学习之模型绑定

    ASP.NET MVC学习之模型绑定(2)   继ASP.NET MVC学习之模型绑定继续 3.手工调用模型绑定 很多情况下我们都是通过形参的方式接收来自http流中的数据,这看似是完美的,但是缺少了 ...

  7. iOS基础 - NSURLSession

    使用URLSession所有的网络访问都是有缓存的,缓存文件自动保存在tmp文件夹中,URLSession本身实现的时候,就是少量多次的! l 使用defaultSessionConfiguratio ...

  8. 企业架构研究总结(38)——TOGAF架构能力框架之架构能力建设和架构治理

    为了确保架构功能在企业中能够被成功地运用,企业需要通过建立适当的组织结构.流程.角色.责任和技能来实现其自身的企业架构能力,而这也正是TOGAF的架构能力框架(Architecture Capabil ...

  9. IOS学习之路二十四(custom 漂亮的UIColor)

    下面简单列举一下漂亮的和颜色,大家也可以自己依次试一试选出自己喜欢的. 转载请注明 本文转自:http://blog.csdn.net/wildcatlele/article/details/1235 ...

  10. IOS学习之路十七(通过delegate进行页面传值)

    加入有A B两个页面,要实现从A跳到B的时候把值传过去,现在用delegate协议来实现 在A中定义一个协议,定义一个实现该协议的属性变量 在B中定义一个值(要获得的值类型)和set方法. 要传值B ...