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 ...
随机推荐
- HDU4099(斐波那契数列与字典树)
题目:Revenge of Fibonacci 题意:给出斐波那契数列的前k位,k不超过40,找出最小的正整数n,满足F(n)的前k位与给定数的前k位相同,斐波那契数列的项数不超过100000. 解析 ...
- 禁用Visual Studio 2013的Browser Link功能
禁用Visual Studio 2013的Browser Link功能 GET http://localhost:37478/7fd25f8af33f443494e765be19be6240/brow ...
- the convertion between string and BlobColumn
It's hard to find some samples about the convertion between string and BlobColumn.AddBlobData. It's ...
- java反射机制入门3
Method对象的机制与实现 1.Method对象概述 1)java.lang.reflect.Method类是用于表示类中.接口中方法对象的类. 2)可以操作类中私有,以及公有等全部方法. 2.Me ...
- FtpManager类
public class FtpManager { /// <summary> /// 主机名 /// </summary> string ftpServerIP; /// & ...
- YII2 Gridview
YII2 Gridview 部分使用规则 1.页面显示的时间戳转换 a. [ 'label'=>'创建日期', 'attribute' => 'created_at', 'filter' ...
- C# DES对称加密解密
/// <summary> /// 加密 /// </summary> /// <param name="str"></param> ...
- 2013 南京邀请赛 K题 yet another end of the world
/** 大意:给定一组x[],y[],z[] 确定有没有两个不同的x[i], x[j] 看是否存在一个ID使得 y[i]<=ID%x[i]<=z[i] y[j]<=ID%x[j]&l ...
- 手把手教你图片转ASCII码图
效果图 基本思路 把图片每个像素点的信息拿出来,最重要的是拿到rgb的值 把每个像素点由rgb转成灰度图像,即0-255 给0-255分级,把每个等级的像素点转换成ascii码,完成 实现 第一步:获 ...
- BZOJ 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典
题目 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 401 Solv ...