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 ...
随机推荐
- 使用OFFSET-FETCH进行数据过滤
TOP的工业标准版 OFFSET-FETCH OFFSET 用来设置跳过行的数量 FETCH 用来设置检索多少行,必须要排序才能用,SQL Server 2012的新语法 从语意的角度来讲如果要跳开几 ...
- Django forms 关于select和checkbox设置初始选中值及让前端选中指定值
Django的forms和models一样很牛逼.他有两种功能,一是生成form表单,还有就是form表单的验证. 这里主要说一下生成form表单时经常用到的需要设置 初始值 / 默认值 的情况. 1 ...
- [LeetCode]题解(python):028-Implement strStr()
题目来源: https://leetcode.com/problems/implement-strstr/ 题意分析: 输入两个字符串haystack和needle,如果needle是haystack ...
- [LeetCode]题解(python):022-Generate Parentheses
题目来源: https://leetcode.com/problems/generate-parentheses/ 题意分析: 题目输入一个整型n,输出n对小括号配对的所有可能性.比如说,如果输入3, ...
- poj 1715 Hexadecimal Numbers 排列组合
/** 大意: 给定16进制数的16个字母,,求第k大的数,,要求数的长度最大为8.,并且每个数互不相同. 思路: 从高到低挨个枚举,每一位能组成的排列数 ,拿最高位来说,能做成的排列数为15*A(1 ...
- asp.net 开发注意的几点
WIN7中组件服务中的DCOM配置找不到Microsoft Excel应用程序的解决办法: 这主要是64位系统的问题,excel是32位的组件,所以在正常的系统组件服务里是看不到的 可以通过在运行里面 ...
- vs2010根据字符串内容添加断点
在vs中我们可以直接用表达式.数值型比较直接用操作符即可. 如i==2,i<2; 但是字符型比较呢? 加入我们有一个名为string的变量,定义如下: char *string="Tw ...
- Python 第一章 基础知识
如果熟其他计算机语言,可能会习惯于每行以分号结束.Python则不同,一行就是一行,不管多少. 如果喜欢的话,可以加上分号,但是不会有任何作用(除非同一行还有更多的代码),而且这也不是同行的做法. & ...
- python获取当前路径的方法
>>> import os>>> homedir = os.getcwd()>>> print homedirD:\python\test > ...
- android应用如何启动另外一个apk应用
在开发的过程中,经常会遇到在一个应用中启动另外一个apk应用的情况 问题的核心点在于我们要拿到第三方apk的package名称跟class名称, 如:package名称是com.funcity.tax ...