Qt实现不同Treewidget之间拖拽
2013-07-14 02:04
435 查看
拖拽是编程中经常要用到的,我这里主要是实习了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 QListWidget拖拽实现
- QT实现拖拽TabWidget选项卡形成单独的窗口,双击标题栏可还原的功能【dock功能】
- 如何使用NFS实现不同服务器之间文件共享
- Vue.js 实现表单数据参数传递,以及不同独立按钮之间的参数传递
- 实现在不同活动之间的转换(Intent的用法)
- 使用boost库实现不同数据类型之间的自由转换
- VC++中鼠标拖动实现不同CListBox框之间内容的转移
- QT学习2:Table/List/Tree的View,Widget,Model相关
- Jquery easyui treegrid实现树形表格的行拖拽
- 多层TreeWidget可选实现
- easyui-tree实现及针对不同结点添加不同右键菜单
- Qt:TreeWidget中添加子控件,并在主窗口接收响应
- Qt for Android QML实现缩放、拖拽、长按效果简单示例
- ubuntu创建samba服务器,实现不同系统之间的互访
- Android判断网络状态是否断开+Android完全关闭应用程序+ 本文讲述了Android中不同Activity之间的数据传递 — Bundle对象的实现(-)+Android中Bundle的使用示例
- Android 自定义Permission实现不同应用之间页面跳转
- QT 实现拖拽记事本功能 直接读取 并且显示
- 不同数据源之间数据同步的几种实现方式