Qt实现不同Treewidget之间拖拽
拖拽是编程中经常要用到的,我这里主要是实习了Treewidget之间直接拖拽Item,按下Ctrl键的话是copy,不按Ctrl则是Move。以下是实现代码
- class TreeItemMimeData:public QMimeData
- {
- Q_OBJECT
- public:
- TreeItemMimeData():QMimeData()
- {
- m_pDragItem = NULL;
- }
- ~TreeItemMimeData()
- {
- }
- void SetDragData(QString mimeType , QTreeWidgetItem *pItem)
- {
- m_format<<mimeType;
- m_pDragItem = pItem;
- }
- QStringList formats() const
- {
- return m_format;
- }
- const QTreeWidgetItem* DragItemData() const
- {
- return m_pDragItem;
- }
- protected:
- QVariant retrieveData(const QString &mimetype, QVariant::Type preferredType) const
- {
- if (mimetype == "ItemMimeData")
- {
- return m_pDragItem;
- }
- else
- {
- return QMimeData::retrieveData(mimetype, preferredType);
- }
- }
- private:
- const QTreeWidgetItem *m_pDragItem;
- QStringList m_format;
- };
- class MyTreeWidget:public QTreeWidget
- {
- Q_OBJECT
- public:
- MyTreeWidget(QWidget *parent = NULL);
- ~MyTreeWidget();
- protected:
- void mouseMoveEvent(QMouseEvent *event);
- void mousePressEvent(QMouseEvent *event);
- void mouseReleaseEvent(QMouseEvent *event);
- void dragEnterEvent(QDragEnterEvent *event);
- void dragMoveEvent(QDragMoveEvent *event);
- void dropEvent(QDropEvent *event);
- void keyPressEvent(QKeyEvent *event);
- void keyReleaseEvent(QKeyEvent *event);
- private:
- QPoint m_startDragPoint;
- void performDrag();
- bool m_CtrlPressed;
- };
- MyTreeWidget::MyTreeWidget(QWidget *parent /*= NULL*/):QTreeWidget(parent)
- {
- m_CtrlPressed = false;
- this->setSelectionMode(QAbstractItemView::ExtendedSelection);
- this->setAcceptDrops(true);
- this->setDragEnabled(true);
- this->setStyleSheet("QTreeWidget::item:selected{ background-color: rgb(150, 0, 0)}");
- }
- MyTreeWidget::~MyTreeWidget()
- {
- }
- void MyTreeWidget::keyPressEvent(QKeyEvent *event)
- {
- if (event->key() == Qt::Key_Control)
- {
- m_CtrlPressed = true;
- }
- }
- void MyTreeWidget::keyReleaseEvent(QKeyEvent *event)
- {
- if (event->key() == Qt::Key_Control)
- {
- m_CtrlPressed = false;
- }
- }
- void MyTreeWidget::mousePressEvent(QMouseEvent *event)
- {
- if (event->button() == Qt::LeftButton)
- {
- m_startDragPoint = event->pos();
- }
- QTreeWidget::mousePressEvent(event);
- }
- void MyTreeWidget::mouseMoveEvent(QMouseEvent *event)
- {
- if (event->buttons() & Qt::LeftButton)
- {
- int dragDistance = (event->pos() - m_startDragPoint).manhattanLength();
- if (dragDistance > QApplication::startDragDistance())
- {
- performDrag();
- }
- }
- QTreeWidget::mouseMoveEvent(event);
- }
- void MyTreeWidget::mouseReleaseEvent(QMouseEvent *event)
- {
- QTreeWidget::mouseReleaseEvent(event);
- }
- void MyTreeWidget::dragEnterEvent(QDragEnterEvent *event)
- {
- QWidget *source = qobject_cast<MyTreeWidget *>(event->source());
- if (source /*&& source != this*/)
- {
- if (m_CtrlPressed)
- {
- event->setDropAction(Qt::CopyAction);
- }
- else
- {
- event->setDropAction(Qt::MoveAction);
- }
- /*event->setDropAction(Qt::MoveAction); */
- event->accept();
- }
- }
- void MyTreeWidget::dragMoveEvent(QDragMoveEvent *event)
- {
- QWidget *source = qobject_cast<MyTreeWidget *>(event->source());
- if (source /*&& source != this*/)
- {
- const TreeItemMimeData *pMimeData = (const TreeItemMimeData *)(event->mimeData());
- const QTreeWidgetItem *item = pMimeData->DragItemData();
- QTreeWidgetItem *currentItem = this->itemAt(event->pos());
- if (currentItem == item) //不允许拖回到原来的item
- {
- event->ignore();
- }
- else
- {
- setCurrentItem(currentItem);
- if (m_CtrlPressed)
- {
- event->setDropAction(Qt::CopyAction);
- }
- else
- {
- event->setDropAction(Qt::MoveAction);
- }
- //event->setDropAction(Qt::MoveAction);
- event->accept();
- }
- }
- }
- void MyTreeWidget::dropEvent(QDropEvent *event)
- {
- QWidget *source = qobject_cast<MyTreeWidget *>(event->source());
- const TreeItemMimeData *pMimeData = (const TreeItemMimeData *)(event->mimeData());
- if (source /*&& source != this*/)
- {
- const QTreeWidgetItem *item = pMimeData->DragItemData();
- QTreeWidgetItem *pItem = item->clone();
- QTreeWidgetItem *currentItem = this->itemAt(event->pos());
- if (currentItem && (currentItem != item))
- {
- currentItem->addChild(pItem);
- }
- else
- {
- this->addTopLevelItem(pItem);
- }
- if (m_CtrlPressed)
- {
- event->setDropAction(Qt::CopyAction);
- }
- else
- {
- event->setDropAction(Qt::MoveAction);
- }
- //event->setDropAction(Qt::MoveAction);
- event->accept();
- }
- }
- void MyTreeWidget::performDrag()
- {
- QTreeWidgetItem *item = currentItem();
- if (item)
- {
- TreeItemMimeData *mimeData = new TreeItemMimeData;
- mimeData->SetDragData("ItemMimeData",item);
- QDrag *drag = new QDrag(this);
- drag->setMimeData(mimeData);
- drag->setPixmap(QPixmap(":/DragDropDemo/Resources/Mail.png"));
- if (m_CtrlPressed)
- {
- drag->exec(Qt::CopyAction);
- }
- else
- {
- drag->exec(Qt::MoveAction);
- delete item;
- }
- }
- }
以下是我演示的截图
http://blog.csdn.net/hai200501019/article/details/9322329
Qt实现不同Treewidget之间拖拽的更多相关文章
- Qt之QAbstractItemView视图项拖拽(二)
一.需求说明 上一篇文章Qt之QAbstractItemView视图项拖拽(一)讲述了实现QAbstractItemView视图项拖拽的一种方式,是基于QDrag实现的,这个类是qt自己封装好了的,所 ...
- Qt之QAbstractItemView视图项拖拽(一)
一.需求说明 最近在搞视图项的拖拽,也上网查了一些资料,好多的文档都是一样的,只是被不通的网站所收录了(也有可能是被爬过去的,不明所以),不过也有一些文档写的不错,不过就是太简易,都是点睛之笔,总之功 ...
- Qt窗口添加鼠标移动拖拽事件
1. .h文件中添加 private: QPoint dragPosition; 2. 在cpp文件中重写鼠标点击和拖拽函数 void ShapeWidget::mousePressEvent( ...
- QT笔记之自定义窗口拖拽移动
1.QT自定义标题栏,拖拽标题栏移动窗口(只能拖拽标题,其他位置无法拖拽) 方法一: 转载:http://blog.sina.com.cn/s/blog_4ba5b45e0102e83h.html . ...
- Qt图形视图体系结构示例解析(视图、拖拽、动画)
本博的示例来自与QT Example:C:\Qt\Qt5.9.3\Examples\Qt-5.9.3\widgets\graphicsview\dragdroprobot 将通过分析示例完成主要功能: ...
- qt 拖拽 修改大小(二)
最近项目需要实现windows下橡皮筋的效果,所以对此做了一些了解,特此记录. 首先windows系统是支持橡皮筋效果的,需要使用win32方 法:SystemParametersInfo(SPI_S ...
- qt中的拖拽及其使用技巧
关于qt中的拖放操作,首先可以看这篇官方文档:http://doc.qt.io/qt-5.5/dnd.html 一.QDrag 首先是创建QDrag,可以在mousePressEvent或者mouse ...
- QT之——QTableWidget拖拽单元格并替换内容(进阶)
所需待重写函数: [virtual] bool QObject::eventFilter(QObject *watched, QEvent *event); /* * Filters events i ...
- Qt拖拽界面 (*.ui) 缩放问题及解决办法
问题 使用Qt Designer 设计的界面,在缩放的时候不能随着主窗口一起缩放. 解决办法 之前遇到这个问题的时候,都是直接重写resizeEvent接口来实现的,在自动生成的Ui_Widget或U ...
随机推荐
- 将一个数转化为二进制后,求其中1的个数 C++
#include <iostream>using namespace std;int func(int x){ int count=0; while(x) { x=x&(x-1); ...
- Regex阅读笔记(一)之入门
在检查一行文本时,^代表一行的开始,$代表结束. 字符数组:[],在里面列举任意多个字符,可以匹配其中任意一个字符,字符组元字符'-'表示一个范围. ^$表示一个空行(没有任何字符,包括空白字符) [ ...
- 转:requirejs打包压缩r.js使用示例
为了应对日益复杂,大规模的JavaScript开发.我们化整为零,化繁为简.将复杂的逻辑划分一个个小单元,各个击破.这时一个项目可能会有几十个甚至上百个JS文件,每个文件为一个模块单元.如果上线时都是 ...
- maven GroupID和ArtifactID填什么
GroupID是项目组织唯一的标识符,实际对应JAVA的包的结构,是main目录里java的目录结构. ArtifactID就是项目的唯一的标识符,实际对应项目的名称,就是项目根目录的名称.一般Gro ...
- STL front() ,back()和begin(),end()区别
首先看看vector里面的: reference front(); const_reference front() const; queue里面的: value_type& front(); ...
- 1294 - Positive Negative Sign(规律)
1294 - Positive Negative Sign PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: ...
- 关于 javascript event flow 的一个bug
[1]描述了firefox,safari 有一个bug和DOM 3 规范不一致:在event.currentTarget等于event.target的时候(即event flow处于target ph ...
- C++ sizeof 操作符的用法总结
在VC中,sizeof有着许多的用法,而且很容易引起一些错误.下面根据sizeof后面的参数对sizeof的用法做个总结. A.参数为数据类型或者为一般变量: 例如sizeof(int),sizeof ...
- 编译kernel:内核makefile的作用
< 嵌入式linux应用完全开发手册 > 韦东山 内核Makefile的使命: 编译哪些内核文件? 读取各级子目录makefile, .config, auto.conf, Kbuild, ...
- 动态规划---最长上升子序列问题(O(nlogn),O(n^2))
LIS(Longest Increasing Subsequence)最长上升子序列 或者 最长不下降子序列.很基础的题目,有两种算法,复杂度分别为O(n*logn)和O(n^2) . ******* ...