Qt-剪切板

摘要:
要在QWidget中实现DragAndDropQWidget,需要实现以下事件。QApplication属于QtWidgets模块,它为QtWidget提供了一些易于使用的功能。使用QClipBoard为窗口系统剪贴板提供一个简单的类。QMimeData整个复制粘贴方案中最重要的部分。QMimeData类可以从剪贴板、DragEvent和DropEvent中获得。在Windows中,文件类型由扩展名表示。HKEY_类_根。Gz和Default表示相关应用。QMimeDatabase维护一个mimetype数据库,它可以是来自系统的数据库。然而,在大多数情况下,操作系统不提供mimetype数据库,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-剪切板》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# 中使用 Excelplsql之导入数据乱码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

模拟浏览器请求(WebRequest)

//参数stringblockType=context。要求从其他公司传递的参数[“BlockType”]///stringblockNo=context.Request.Params[“BlockNo”];//blockList.其中(c=&gt;blockType=SZ&amp;...

阿里云oss对象存储在vue中的使用

阿里云对象存储OSS(ObjectStorageService)是阿里云提供的海量、安全、低成本、高持久的云存储服务。阿里云oss对象存储是阿里云提供的海量、安全、低成本、高持久的云存储服务,包括服务端加密、客户端加密、防盗链、IP黑白名单、细粒度权限管控、日志审计、WORM特性等。满足企业数据安全与合规要求多线BGP骨干网络。...

PHP是怎么运行的

严格来说,与PHP相关的过程不需要手动启动。它们与Apache启动一起运行。当然,如果需要重新启动PHP服务,可以手动重新启动PHP。最后,它被移交给PHP内核的ZendEngine进行顺序执行。PHP在开始执行后将经历两个主要阶段:处理请求之前的开始阶段和请求之后的结束阶段。PHP的结束阶段分为两个阶段:禁用模块和关闭模块。...

Cesium深入浅出之视频投影【转】

通常,我们使用矩形,因为视频形状是方形的。据怀疑,视频标签隐藏了这段关系。如果再次显示,视频将再次移动。此处使用VideoSynchronizer。它可以使视频元素与铯的模拟时钟同步。让我们看看它的构造函数:name type description optionsObject option子属性:name type默认值description用于驱动视频的...

开源项目推荐:Qt有关的GitHub/Gitee开源项目

https://www.froglogic.com/windeployqthttps://doc.qt.io/Qt-5/windows部署。htmlhttps://wiki.qt.io/Deploy_an_Application_on_Windowshttps://github.com/lucasg/Dependencieshttp://www.depend...

最新版Swagger 3升级指南和新功能体验!

因此,本期将为您带来一篇关于Swagger最新版本的文章。本文将向您展示Swagger最新版本的变化?如何将旧版本的Swagger升级到新版本?Swagger是一个用于生成、描述和调用RESTful接口的Web服务。Swagger 2.9.2的使用分为以下四个步骤:添加依赖项、启用Swagger功能、配置Swagger文档摘要信息和调用接口访问。让我们分别来...