Qt-剪切板
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-剪切板的更多相关文章
- 浏览器中用JavaScript获取剪切板中的文件
本文转自我的个人网站 , 原文地址:http://www.zoucz.com/blog/2016/01/29/get-file-from-clipboard/ ,欢迎前往交流讨论 在网页上编辑内容 ...
- 监视 Windows 剪切板
一.先看代码 import win32con,win32gui import win32clipboard as cb class MyWindow(): def __init__(self): #注 ...
- WPF剪切板问题-OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN))
WPF剪切板问题-OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN)) 最近碰到一个问题,需要弄个小工具来解决.刚好接触到WPF, ...
- 小菜学习Winform(六)剪切板和拖放复制
前言 在做winform项目的时候有时候会用到复制粘贴,在.net中提供了Clipboard类来操作剪切板,我们来看下. clipbrd.exe clipbrd是系统剪切板程序,但是在vista及以上 ...
- Python访问剪切板
剪切板访问工具 ----pyperclip he purpose of Pyperclip is to provide a cross-platform Python module for copyi ...
- JS从剪切板里粘贴图片
功能需求:在网页中,Ctrl+V,把系统剪切板的图片(比如QQ截图)进行粘贴.显示.上传...,提高用户体验. 参考链接:https://ruby-china.org/topics/17266 git ...
- VBS操作剪切板
'设置剪切板的内容 Dim Form, TextBox Set Form = CreateObject("Forms.Form.1") Set TextBox = Form.Con ...
- 重新想象 Windows 8 Store Apps (40) - 剪切板: 复制/粘贴文本, html, 图片, 文件
[源码下载] 重新想象 Windows 8 Store Apps (40) - 剪切板: 复制/粘贴文本, html, 图片, 文件 作者:webabcd 介绍重新想象 Windows 8 Store ...
- 在多浏览器使用JS复制内容到剪切板,无需插件
最近在学习DHTMLX,下载了一些JS源码,使用谷歌浏览器,在学习dhtmlxGrid部分进行复制表格内容时,发现,在线版的可以复制成功,而本地的不可以复制,报类似访问剪切板错误,经查找原因,原来是谷 ...
- Javascript操作剪切板数据(支持IE、Chrome、360、搜狗),亲测!
clipboarddata只能在IE浏览器中使用,在chrome下会提示对象未定义!以下的方法支持IE.Chrome.360.搜狗等浏览器,其它浏览器还未验证. <!DOCTYPE html&g ...
随机推荐
- GIT+云盘作 做 文档管理工具
GIT+云盘作 做 文档管理工具 在工作中, 会遇到公司的文档 和 自己家里的 文档进行同步的问题, 通常我们使用U盘作为传输节制, 但是不是非常好,文档的改动都不能发现, 导致回家同步的时候, 出各 ...
- Reactive Extensions
Rx提供了一种新的组织和协调异步事件的方式,极大的简化了代码的编写.Rx最显著的特性是使用可观察集合(Observable Collection)来达到集成异步(composing asynchron ...
- Markdown的使用
原文:http://wowubuntu.com/markdown/ git:https://gitcafe.com/riku/Markdown-Syntax-CN/ 记录一下Markdown的使用,I ...
- js模版引擎handlebars.js实用教程
js模版引擎handlebars.js实用教程 阅读本文需要了解基本的Handlebars.js概念,本文并不是Handlebars.js基础教程,而是注重于实际应用,为读者阐述使用过程中可能会遇到的 ...
- probuf了解
人们一直在强调,同 XML 相比, Protobuf 的主要优点在于性能高.它以高效的二进制方式存储,比 XML 小 3 到 10 倍,快 20 到 100 倍. 对于这些 “小 3 到 10 倍”, ...
- c#实现microsoft账号登入授权(OAuth 2.0)并获取个人信息
本博主要介绍microsoft 账号授权(OAuth 2.0)登入并获取用户信息的过程,因为写过google账号授权登入的过程,所以这里就简单介绍一下,google授权登入参考地址:http://ww ...
- Head first设计模式
使用NeatUpload控件实现ASP.NET大文件上传 一般10M以下的文件上传通过设置Web.Config,再用VS自带的FileUpload控件就可以了,但是如果要上传100M甚至1G的文件就不 ...
- 使用protobuf编写配置文件以及读写
.proto文件示例 message Configure { required ; required uint32 port = ; } 写配置文件 Configure config; config. ...
- 基于 WebSocket 构建跨浏览器的实时应用
Socket.IO – 基于 WebSocket 构建跨浏览器的实时应用 Socket.IO 是一个功能非常强大的框架,能够帮助你构建基于 WebSocket 的跨浏览器的实时应用.支持主流浏览器,多 ...
- [读书心得] .NET中 类型,对象,线程栈,托管堆在运行时的关系
.NET中 类型,对象,线程栈,托管堆 在运行时的关系 The Relationship at Run Time between Types,Objects,A Thread's Stack,and ...