拖拽是编程中经常要用到的,我这里主要是实习了Treewidget之间直接拖拽Item,按下Ctrl键的话是copy,不按Ctrl则是Move。以下是实现代码

  1. class TreeItemMimeData:public QMimeData
  2. {
  3. Q_OBJECT
  4. public:
  5. TreeItemMimeData():QMimeData()
  6. {
  7. m_pDragItem = NULL;
  8. }
  9. ~TreeItemMimeData()
  10. {
  11. }
  12. void SetDragData(QString mimeType , QTreeWidgetItem *pItem)
  13. {
  14. m_format<<mimeType;
  15. m_pDragItem = pItem;
  16. }
  17. QStringList formats() const
  18. {
  19. return m_format;
  20. }
  21. const QTreeWidgetItem* DragItemData() const
  22. {
  23. return m_pDragItem;
  24. }
  25. protected:
  26. QVariant retrieveData(const QString &mimetype, QVariant::Type preferredType) const
  27. {
  28. if (mimetype == "ItemMimeData")
  29. {
  30. return m_pDragItem;
  31. }
  32. else
  33. {
  34. return QMimeData::retrieveData(mimetype, preferredType);
  35. }
  36. }
  37. private:
  38. const QTreeWidgetItem   *m_pDragItem;
  39. QStringList              m_format;
  40. };
  41. class MyTreeWidget:public QTreeWidget
  42. {
  43. Q_OBJECT
  44. public:
  45. MyTreeWidget(QWidget *parent = NULL);
  46. ~MyTreeWidget();
  47. protected:
  48. void mouseMoveEvent(QMouseEvent *event);
  49. void mousePressEvent(QMouseEvent *event);
  50. void mouseReleaseEvent(QMouseEvent *event);
  51. void dragEnterEvent(QDragEnterEvent *event);
  52. void dragMoveEvent(QDragMoveEvent *event);
  53. void dropEvent(QDropEvent *event);
  54. void keyPressEvent(QKeyEvent *event);
  55. void keyReleaseEvent(QKeyEvent *event);
  56. private:
  57. QPoint     m_startDragPoint;
  58. void       performDrag();
  59. bool       m_CtrlPressed;
  60. };
  1. MyTreeWidget::MyTreeWidget(QWidget *parent /*= NULL*/):QTreeWidget(parent)
  2. {
  3. m_CtrlPressed = false;
  4. this->setSelectionMode(QAbstractItemView::ExtendedSelection);
  5. this->setAcceptDrops(true);
  6. this->setDragEnabled(true);
  7. this->setStyleSheet("QTreeWidget::item:selected{ background-color: rgb(150, 0, 0)}");
  8. }
  9. MyTreeWidget::~MyTreeWidget()
  10. {
  11. }
  12. void MyTreeWidget::keyPressEvent(QKeyEvent *event)
  13. {
  14. if (event->key() == Qt::Key_Control)
  15. {
  16. m_CtrlPressed = true;
  17. }
  18. }
  19. void MyTreeWidget::keyReleaseEvent(QKeyEvent *event)
  20. {
  21. if (event->key() == Qt::Key_Control)
  22. {
  23. m_CtrlPressed = false;
  24. }
  25. }
  26. void MyTreeWidget::mousePressEvent(QMouseEvent *event)
  27. {
  28. if (event->button() == Qt::LeftButton)
  29. {
  30. m_startDragPoint = event->pos();
  31. }
  32. QTreeWidget::mousePressEvent(event);
  33. }
  34. void MyTreeWidget::mouseMoveEvent(QMouseEvent *event)
  35. {
  36. if (event->buttons() & Qt::LeftButton)
  37. {
  38. int dragDistance = (event->pos() - m_startDragPoint).manhattanLength();
  39. if (dragDistance > QApplication::startDragDistance())
  40. {
  41. performDrag();
  42. }
  43. }
  44. QTreeWidget::mouseMoveEvent(event);
  45. }
  46. void MyTreeWidget::mouseReleaseEvent(QMouseEvent *event)
  47. {
  48. QTreeWidget::mouseReleaseEvent(event);
  49. }
  50. void MyTreeWidget::dragEnterEvent(QDragEnterEvent *event)
  51. {
  52. QWidget *source =  qobject_cast<MyTreeWidget *>(event->source());
  53. if (source /*&& source != this*/)
  54. {
  55. if (m_CtrlPressed)
  56. {
  57. event->setDropAction(Qt::CopyAction);
  58. }
  59. else
  60. {
  61. event->setDropAction(Qt::MoveAction);
  62. }
  63. /*event->setDropAction(Qt::MoveAction);  */
  64. event->accept();
  65. }
  66. }
  67. void MyTreeWidget::dragMoveEvent(QDragMoveEvent *event)
  68. {
  69. QWidget *source =  qobject_cast<MyTreeWidget *>(event->source());
  70. if (source /*&& source != this*/)
  71. {
  72. const TreeItemMimeData *pMimeData = (const TreeItemMimeData *)(event->mimeData());
  73. const QTreeWidgetItem *item = pMimeData->DragItemData();
  74. QTreeWidgetItem *currentItem = this->itemAt(event->pos());
  75. if (currentItem == item)           //不允许拖回到原来的item
  76. {
  77. event->ignore();
  78. }
  79. else
  80. {
  81. setCurrentItem(currentItem);
  82. if (m_CtrlPressed)
  83. {
  84. event->setDropAction(Qt::CopyAction);
  85. }
  86. else
  87. {
  88. event->setDropAction(Qt::MoveAction);
  89. }
  90. //event->setDropAction(Qt::MoveAction);
  91. event->accept();
  92. }
  93. }
  94. }
  95. void MyTreeWidget::dropEvent(QDropEvent *event)
  96. {
  97. QWidget *source =  qobject_cast<MyTreeWidget *>(event->source());
  98. const TreeItemMimeData *pMimeData = (const TreeItemMimeData *)(event->mimeData());
  99. if (source /*&& source != this*/)
  100. {
  101. const QTreeWidgetItem *item = pMimeData->DragItemData();
  102. QTreeWidgetItem *pItem = item->clone();
  103. QTreeWidgetItem *currentItem = this->itemAt(event->pos());
  104. if (currentItem && (currentItem != item))
  105. {
  106. currentItem->addChild(pItem);
  107. }
  108. else
  109. {
  110. this->addTopLevelItem(pItem);
  111. }
  112. if (m_CtrlPressed)
  113. {
  114. event->setDropAction(Qt::CopyAction);
  115. }
  116. else
  117. {
  118. event->setDropAction(Qt::MoveAction);
  119. }
  120. //event->setDropAction(Qt::MoveAction);
  121. event->accept();
  122. }
  123. }
  124. void MyTreeWidget::performDrag()
  125. {
  126. QTreeWidgetItem *item = currentItem();
  127. if (item)
  128. {
  129. TreeItemMimeData *mimeData = new TreeItemMimeData;
  130. mimeData->SetDragData("ItemMimeData",item);
  131. QDrag *drag = new QDrag(this);
  132. drag->setMimeData(mimeData);
  133. drag->setPixmap(QPixmap(":/DragDropDemo/Resources/Mail.png"));
  134. if (m_CtrlPressed)
  135. {
  136. drag->exec(Qt::CopyAction);
  137. }
  138. else
  139. {
  140. drag->exec(Qt::MoveAction);
  141. delete item;
  142. }
  143. }
  144. }

以下是我演示的截图

http://blog.csdn.net/hai200501019/article/details/9322329

Qt实现不同Treewidget之间拖拽的更多相关文章

  1. Qt之QAbstractItemView视图项拖拽(二)

    一.需求说明 上一篇文章Qt之QAbstractItemView视图项拖拽(一)讲述了实现QAbstractItemView视图项拖拽的一种方式,是基于QDrag实现的,这个类是qt自己封装好了的,所 ...

  2. Qt之QAbstractItemView视图项拖拽(一)

    一.需求说明 最近在搞视图项的拖拽,也上网查了一些资料,好多的文档都是一样的,只是被不通的网站所收录了(也有可能是被爬过去的,不明所以),不过也有一些文档写的不错,不过就是太简易,都是点睛之笔,总之功 ...

  3. Qt窗口添加鼠标移动拖拽事件

    1. .h文件中添加 private:    QPoint dragPosition; 2. 在cpp文件中重写鼠标点击和拖拽函数 void ShapeWidget::mousePressEvent( ...

  4. QT笔记之自定义窗口拖拽移动

    1.QT自定义标题栏,拖拽标题栏移动窗口(只能拖拽标题,其他位置无法拖拽) 方法一: 转载:http://blog.sina.com.cn/s/blog_4ba5b45e0102e83h.html . ...

  5. Qt图形视图体系结构示例解析(视图、拖拽、动画)

    本博的示例来自与QT Example:C:\Qt\Qt5.9.3\Examples\Qt-5.9.3\widgets\graphicsview\dragdroprobot 将通过分析示例完成主要功能: ...

  6. qt 拖拽 修改大小(二)

    最近项目需要实现windows下橡皮筋的效果,所以对此做了一些了解,特此记录. 首先windows系统是支持橡皮筋效果的,需要使用win32方 法:SystemParametersInfo(SPI_S ...

  7. qt中的拖拽及其使用技巧

    关于qt中的拖放操作,首先可以看这篇官方文档:http://doc.qt.io/qt-5.5/dnd.html 一.QDrag 首先是创建QDrag,可以在mousePressEvent或者mouse ...

  8. QT之——QTableWidget拖拽单元格并替换内容(进阶)

    所需待重写函数: [virtual] bool QObject::eventFilter(QObject *watched, QEvent *event); /* * Filters events i ...

  9. Qt拖拽界面 (*.ui) 缩放问题及解决办法

    问题 使用Qt Designer 设计的界面,在缩放的时候不能随着主窗口一起缩放. 解决办法 之前遇到这个问题的时候,都是直接重写resizeEvent接口来实现的,在自动生成的Ui_Widget或U ...

随机推荐

  1. 原生JS实现字符串分割

    window.onload = function(){ var str = 'abc,dbc,qqq,aaa'; var sp = split(str,',')//与字符串的分隔符要一直. alert ...

  2. JavaScript编程风格--基本的格式化

    缩进层级     推荐4个空格字符作为一个缩进层级. 语句结尾     推荐不要省略分号. 行的长度     最好一行不超过80个字符. 换行     在运算符后换行,下一行增加两个层级的缩进.   ...

  3. SAP HANA 开发者中心(Developer Center)入门指南

  4. HTML5 总结-表单-输入类型

    HTML5 Input 类型 HTML5 新的 Input 类型 HTML5 拥有多个新的表单输入类型.这些新特性提供了更好的输入控制和验证. 本章全面介绍这些新的输入类型: email url nu ...

  5. python网络编程——将IPv4地址转换成不同的格式

    1.将IPv4地址转换为32位二进制格式,用做底层网络函数. import socket from binascii import hexlify def convert_IPv4_address() ...

  6. 深入浅出—JAVA(1)

    1.基本概念 JAVA的工作方式 编写源代码文件--用编译器运行源代码(javac)--编译器会产出字节码--通过JAVA虚拟机读取与执行字节码(jvm). JAVA的程序结构 什么是源文件? 源文件 ...

  7. hibernate 延长加载范围 4.2

    1. 关闭延迟加载功能 lazy="false"2.修改抓取策略 fetch="join"直接查询关联数据,一个联接查询搞定3.使用Hibernate对象的in ...

  8. BZOJ 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典

    题目 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 401  Solv ...

  9. Linux 静态库与共享库的使用

    申明: 正如题如示,本篇讲的是Linux下是静态库与共享库,而Window下的动态链接库详细情况可见这篇文章:windows动态链接库 DLL 浅析.虽然原理,思想差不多,但是细节却各有不同. 一.静 ...

  10. leetcode先刷_Search in Rotated Sorted Array II

    上一页下一页,找到相同的旋转阵列的问题.假设数组元素一再怎么办呢?会发生什么? 我给大家举一个极端的例子.如果是这样的阵列中的元件.1,1,2,1,1,1,1,我们想看看这个数组2,刚开始A[midd ...