Qt学习之路(54): 自定义拖放数据对象
- 将自定义数据作为 QByteArray 对象,使用 QMimeData::setData() 函数作为二进制数据存储到 QMimeData 中,然后使用 QMimeData::Data() 读取;
- 继承 QMimeData,重写其中的 formats() 和 retrieveData() 函数操作自定义数据;
- 如果拖放操作仅仅发生在同一个应用程序,可以直接继承 QMimeData,然后使用任意合适的数据结构进行存储。
- void MyTableWidget::mouseMoveEvent(QMouseEvent *event)
- {
- if (event->buttons() & Qt::LeftButton) {
- int distance = (event->pos() - startPos).manhattanLength();
- if (distance >= QApplication::startDragDistance())
- performDrag();
- }
- QTableWidget::mouseMoveEvent(event);
- }
- void MyTableWidget::performDrag()
- {
- QString plainText = selectionAsPlainText();
- if (plainText.isEmpty())
- return;
- QMimeData *mimeData = new QMimeData;
- mimeData->setText(plainText);
- mimeData->setHtml(toHtml(plainText));
- mimeData->setData("text/csv", toCsv(plainText).toUtf8());
- QDrag *drag = new QDrag(this);
- drag->setMimeData(mimeData);
- if (drag->exec(Qt::CopyAction | Qt::MoveAction) == Qt::MoveAction)
- deleteSelection();
- }
- QString MyTableWidget::toCsv(const QString &plainText)
- {
- QString result = plainText;
- result.replace("\\", "\\\\");
- result.replace("\"", "\\\"");
- result.replace("\t", "\", \"");
- result.replace("\n", "\"\n\"");
- result.prepend("\"");
- result.append("\"");
- return result;
- }
- QString MyTableWidget::toHtml(const QString &plainText)
- {
- QString result = Qt::escape(plainText);
- result.replace("\t", "<td>");
- result.replace("\n", "\n<tr><td>");
- result.prepend("<table>\n<tr><td>");
- result.append("\n</table>");
- return result;
- }
Red Green Blue
Cyan Yellow Magenta
"Red", "Green", "Blue"
"Cyan", "Yellow", "Magenta"
<tr><td>Red<td>Green<td>Blue
<tr><td>Cyan<td>Yellow<td>Magenta
</table>
- void MyTableWidget::dropEvent(QDropEvent *event)
- {
- if (event->mimeData()->hasFormat("text/csv")) {
- QByteArray csvData = event->mimeData()->data("text/csv");
- QString csvText = QString::fromUtf8(csvData);
- // ...
- event->acceptProposedAction();
- } else if (event->mimeData()->hasFormat("text/plain")) {
- QString plainText = event->mimeData()->text();
- // ...
- event->acceptProposedAction();
- }
- }
- class TableMimeData : public QMimeData
- {
- Q_OBJECT
- public:
- TableMimeData(const QTableWidget *tableWidget,
- const QTableWidgetSelectionRange &range);
- const QTableWidget *tableWidget() const { return myTableWidget; }
- QTableWidgetSelectionRange range() const { return myRange; }
- QStringList formats() const;
- protected:
- QVariant retrieveData(const QString &format,
- QVariant::Type preferredType) const;
- private:
- static QString toHtml(const QString &plainText);
- static QString toCsv(const QString &plainText);
- QString text(int row, int column) const;
- QString rangeAsPlainText() const;
- const QTableWidget *myTableWidget;
- QTableWidgetSelectionRange myRange;
- QStringList myFormats;
- };
- TableMimeData::TableMimeData(const QTableWidget *tableWidget,
- const QTableWidgetSelectionRange &range)
- {
- myTableWidget = tableWidget;
- myRange = range;
- myFormats << "text/csv" << "text/html" << "text/plain";
- }
- QStringList TableMimeData::formats() const
- {
- return myFormats;
- }
- QVariant TableMimeData::retrieveData(const QString &format,
- QVariant::Type preferredType) const
- {
- if (format == "text/plain") {
- return rangeAsPlainText();
- } else if (format == "text/csv") {
- return toCsv(rangeAsPlainText());
- } else if (format == "text/html") {
- return toHtml(rangeAsPlainText());
- } else {
- return QMimeData::retrieveData(format, preferredType);
- }
- }
- void MyTableWidget::dropEvent(QDropEvent *event)
- {
- const TableMimeData *tableData =
- qobject_cast<const TableMimeData *>(event->mimeData());
- if (tableData) {
- const QTableWidget *otherTable = tableData->tableWidget();
- QTableWidgetSelectionRange otherRange = tableData->range();
- // ...
- event->acceptProposedAction();
- } else if (event->mimeData()->hasFormat("text/csv")) {
- QByteArray csvData = event->mimeData()->data("text/csv");
- QString csvText = QString::fromUtf8(csvData);
- // ...
- event->acceptProposedAction();
- } else if (event->mimeData()->hasFormat("text/plain")) {
- QString plainText = event->mimeData()->text();
- // ...
- event->acceptProposedAction();
- }
- QTableWidget::mouseMoveEvent(event);
- }
本文出自 “豆子空间” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/288742
Qt学习之路(54): 自定义拖放数据对象的更多相关文章
- Qt 学习之路:自定义事件
尽管 Qt 已经提供了很多事件,但对于更加千变万化的需求来说,有限的事件都是不够的.例如,我要支持一种新的设备,这个设备提供一种崭新的交互方式,那么,这种事件如何处理呢?所以,允许创建自己的事件 类型 ...
- Qt 学习之路 :可视化显示数据库数据
前面我们用了两个章节介绍了 Qt 提供的两种操作数据库的方法.显然,使用QSqlQuery的方式更灵活,功能更强大,而使用QSqlTableModel则更简单,更方便与 model/view 结合使用 ...
- Qt学习之路(45): 自定义model之一
前面我们说了Qt提供的几个预定义model.但是,面对变化万千的需求,那几个model是远远不能满足我们的需要的.另外,对于Qt这种框架来说,model的选择首先要能满足绝大多数功能的需要,这就是说, ...
- Qt学习之路:自定义Model三篇,自定义委托等等
http://devbean.blog.51cto.com/448512/d-8/p-2
- Qt 学习之路 2(53):自定义拖放数据
Qt 学习之路 2(53):自定义拖放数据 豆子 2013年5月26日 Qt 学习之路 2 13条评论上一章中,我们的例子使用系统提供的拖放对象QMimeData进行拖放数据的存储.比如使用QM ...
- Qt 学习之路 2(54):剪贴板
Qt 学习之路 2(54):剪贴板 豆子 2013年6月8日 Qt 学习之路 2 2条评论 剪贴板的操作经常和前面所说的拖放技术在一起使用.大家对剪贴板都很熟悉.我们可以简单地把它理解成一个数据存储池 ...
- Qt 学习之路 2(49):自定义只读模型
Qt 学习之路 2(49):自定义只读模型 豆子 2013年5月5日 Qt 学习之路 2 18条评论 model/view 模型将数据与视图分割开来,也就是说,我们可以为不同的视图,QListView ...
- Qt 学习之路 2(5):自定义信号槽
Home / Qt 学习之路 2 / Qt 学习之路 2(5):自定义信号槽 Qt 学习之路 2(5):自定义信号槽 豆子 2012年8月24日 Qt 学习之路 2 131条评论 上一节我们详 ...
- Qt 学习之路 2(57):可视化显示数据库数据
Qt 学习之路 2(57):可视化显示数据库数据(skip) 豆子 2013年6月26日 Qt 学习之路 2 26条评论 前面我们用了两个章节介绍了 Qt 提供的两种操作数据库的方法.显然,使用QSq ...
随机推荐
- Enze frist day
今天是我来到云和学院正式开班上课的第一天,我选择学习的科目是.net.因为.net我在学校的时候接触过一些,所以我想要更加深入的去学习.我觉得一个学生在学习上最怕的是没有遇到一位负责任的好老师,但幸运 ...
- 【转】 利用spring的profile切换不同的环境
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- myeclipse 8.6 插件安装之SVN
在这里我要说明一点,myEclipse 8.6的插件安装和之前的版本可能会有一些区别,下面是SVN插件的安装: 1.从官网下载site-1.6.13.zip文件,网址是:subclipse.tigri ...
- json格式字符串与java.util.Map的互转(借助于jackson.jar)
package com.test.javaAPI.json; /** * json工具类 * * @author Wei * @time 2016年10月2日 下午4:25:25 */ public ...
- memcache学习使用
一.安装 二.telnet测试 启动:memcached -d -m 120.24.242.100 -p 11211 -u root 测试:telnet localhost 11211 >> ...
- design pattern factory method #Reprinted#
引入人.工厂.和斧子的问题: (1),原始社会时,劳动社会基本没有分工,需要斧子的人(调用者)只好自己去磨一把斧子,每个人拥有自己的斧子,如果把大家的石斧改为铁斧,需要每个人都要学会磨铁斧的本领,工作 ...
- ASP.NET JQuery 随笔-搜索框默认提示
一.文本框中创建默认文本提示 通常用户在搜索内容时,在文本框输入内容前,文本框都会给出默认提示,提示用户输入正确的内容进行搜索. 当文本框获得焦点,如果文本框内容跟提示内容一样,提示内容会自然消失. ...
- QT无标题窗口在任务栏显示关闭(增加系统菜单)
在对话框中使用了如下代码: setWindowFlags(Qt::FramelessWindowHint); 在任务栏上右键点击程序,不会弹出菜单,解决办法,使用下面代码: setWindowFlag ...
- Windows Phone 8初学者开发—第3部分:编写第一个Windows Phone 8应用程序
原文 Windows Phone 8初学者开发—第3部分:编写第一个Windows Phone 8应用程序 原文地址: http://channel9.msdn.com/Series/Windows- ...
- 基于visual Studio2013解决C语言竞赛题之0401阶乘
题目 解决代码及点评 这个是一道经典的教科书题目,基本上每本基础的c/c++语言教科书都会有这个题目 用来演示循环语句 #include <stdio.h> #include ...