• 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
    	}
  • 相关阅读:
    python学习之- 内置函数
    python学习之- 生成器/迭代器
    python学习之-- 装饰器
    python基础之
    Python基础之 一 字符编码及转换
    为什么utf8占用3个字节
    Python基础之 一 文件操作
    IIS6与IIS7中如何设置文件过期
    分布式缓存系统Memcached简介与实践
    Log4net
  • 原文地址:https://www.cnblogs.com/aslistener/p/6289923.html
Copyright © 2020-2023  润新知