Qt实现不同Treewidget之间拖拽
来源:互联网 发布:mac os x使用手册 编辑:程序博客网 时间:2024/06/05 20:22
拖拽是编程中经常要用到的,我这里主要是实习了Treewidget之间直接拖拽Item,按下Ctrl键的话是copy,不按Ctrl则是Move。以下是实现代码
class TreeItemMimeData:public QMimeData{Q_OBJECTpublic: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_OBJECTpublic: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;}} }以下是我演示的截图
- Qt实现不同Treewidget之间拖拽
- Qt treewidget 复选框
- Qt中的treeWidget使用
- Qt删除TreeWidget节点
- Qt中右击菜单(treeWidget)
- qt treewidget 的模糊查询
- Qt TreeWidget的增删改
- Qt 页面布局+TreeWidget插入复选框
- Qt 学习笔记 TreeWidget 增删改
- Qt 中Treewidget添加右键菜单
- Qt 中Treewidget添加右键菜单
- QT之不同主机之间TCP通信
- qt不同窗口之间的切换
- Qt不同数据类型之间的转换
- Qt:TreeWidget(树控件)的简单操作
- [Qt]Qt--拖拽实现
- Ogre实现不同动画之间的混合
- Ogre实现不同动画之间的混合
- skill c for macro (c语言)
- 字符串逆序(lus实现)
- loadstring表达式求值(lua语言)
- lua调用外部lua方法 (lua语言)
- lua 用闭包写的按钮程序(lua)
- Qt实现不同Treewidget之间拖拽
- 用lua写一个闭包的例子(lua语言)
- lua输出arg参数的函数(lua语言)
- 求一元二次方程的根(lua实现)
- 如何判断自己是更适合技术岗位还是更适合销售类的岗位
- lua运算符优先级表(lua语言)
- socket ip地址的写法等(vc源码)
- lua求表中最大值序号及最大值的的函数(lua实现)
- Java布局管理器(五)之BoxLayout布局管理