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);
- }
Qt学习之路(54): 自定义拖放数据对象相关推荐
- Qt学习之路_12(简易数据管理系统)
原文地址为: Qt学习之路_12(简易数据管理系统) 前言 最近从大陆来到台湾,之间杂事很多,挤不出时间来更新博客- 这次主要是通过做一个简易的数据库管理系统,来学习在Qt中对数据库,xml,界面的各 ...
- QT学习之路2 学习笔记
QT学习之路2 学习笔记 1.Qt 是一个著名的 C++ 应用程序框架.你并不能说它只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI 组件.使用 Qt,在一定程度上你获得的是一个&quo ...
- 《Qt 学习之路 2》
Home / Qt 学习之路 2 / <Qt 学习之路 2>目录 <Qt 学习之路 2>目录 序 Qt 前言 Hello, world! 信号槽 自定义信号槽 Qt 模块简介 ...
- Qt学习之路(24): QPainter(改写paintEvent)
Qt学习之路(24): QPainter(改写paintEvent) 多些大家对我的支持啊!有朋友也提出,前面的几节有关event的教程缺少例子.因为event比较难做例子,也就没有去写,只是把大概写 ...
- [记录]学习QT学习之路2第四天
今天学习内容对应<<QT学习之路2>>第18到23部分,主要是有关于QT事件这一部分的内容(=_=真是看到我快吐了,感觉这本书不适合我这种初学者). 先放出思维导图 难点总结 ...
- [记录]QT学习之路2学习第三天
今天的内容对应的是<<QT学习之路2>>第13到17部分. 主要内容由思维导图总结 一,什么是QT对话框 二,什么是QT标准对话框 三,怎么样实现QT对话框数据传递 四,深入了 ...
- 转载: Qt 学习之路 2归档
Qt 学习之路 2归档 http://www.devbean.net/2012/08/qt-study-road-2-catelog/
- 对QT学习之路12-14的源代码补充与修正
QT学习之路12-14的源代码有些不完整,为了更好的让大家学习,本人做了一点修正与补充,谢谢.源代码如下: 头文件: #ifndef MAINWINDOW_H #define MAINWINDOW_H ...
- java qt gui_工控编程,Qt 学习之路
原标题:工控编程,Qt 学习之路 Qt 是一个著名的 C++ 库--或许并不能说这只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI.使用 Qt,在一定程序上你获得的是一个"一站 ...
- QT学习之路(一)ubuntu 18.04的Qt Creator在线安装
文章目录 前言 一.准备工作 二.安装步骤 参考链接 前言 Qt是嵌入式开发的必备工具之一,在Linux下安装尤其重要. Qt是C++的一个库,或者说是开发框架,里面集成了一些库函数,提高开发效率. ...
最新文章
- C语言/C++基础知识
- pb90代码如何连接sql2008r2_如何使用 HTTP Headers 来保护你的 Web 应用
- css 网格布局_CSS网格布局
- KVC的底层实现原理
- SAP License:制造企业信息化新动向
- python2 与python3 区别的总结 持续更新中......
- 阿里数据中台大火,国外却在建设数据湖,这两者什么关系?
- 蓝桥杯 ADV-223 算法提高 8-1因式分解
- 从FindBugs中学Java【四】
- 集成电路布图设计独创性判断标准
- Aspose.Cells生成Excel图表
- Padavan(老毛子)脚本自动切换网关和 DNS 服务器
- FPGA零基础学习:数字电路中的数字表示
- 仿vivo控制中心下载_手机控制中心app
- e与phi不互素 --- 五道题详记
- 工业级芯片可靠性试验项目条件
- 无线交换机 dhcp服务器,在一台交换机上有DHCP服务器,在另一台交换机上实现DHCP中继...
- STM32关闭PWM输出时,让IO输出固定高或低电平的方法。
- 遇到不能复制的PDF文档,怎么办?
- 黄荣奎:如何快速、便捷开发小程序
热门文章
- spring_150904_hibernatetemplate
- 安卓学习-界面-ui-Spinner
- oracle pl/sql 无监听程序
- LE SHAN GIANT BUDDHA and LINGYUN TEMPLE
- Linux内核分析(六) 文件系统
- Docker 多模块打包启动(kitty-generator)
- jenkins手把手教你从入门到放弃02-jenkins在Windows系统安装与配置(详解)
- ROS入门(一) 文件结构篇
- HDOJ 2071 Max Num
- 修改FCKEditor实现将图片、文件等保存到数据库