Qt实现不同Treewidget之间拖拽
2016-02-01 18:52
483 查看
拖拽是编程中经常要用到的,我这里主要是实习了Treewidget之间直接拖拽Item,按下Ctrl键的话是copy,不按Ctrl则是Move。以下是实现代码
[cpp] view plain copy
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;
};
[cpp] view plain copy
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://img.blog.csdn.net/20130714020427640?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFpMjAwNTAxMDE5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
http://blog.csdn.net/hai200501019/article/details/9322329
[cpp] view plain copy
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;
};
[cpp] view plain copy
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实现QQ好友下拉列表(用QListView实现,所以还得定义它的Model)
- Qt同步线程(比较清楚,而且QMutex QMutexLocker QReadWriteLock QSemaphore QWaitCondition 每个都有例子)
- QTabWidget 实现类似QQ聊天窗口(拖动分离出新的窗口)
- Qt 状态机框架学习(没学会)
- Qt 智能指针学习(7种QT智能指针和4种std智能指针)
- qt 使用xlslib操作execl
- 使用Qt库时出现winsock2.h和windos.h包含顺序错误
- PyQt5 笔记(04):主窗口卡死问题
- Ogre3D嵌入Qt框架 之 小结
- 分享一个自己写的QT小游戏-玛丽奥医生
- Qt 学习之路 2(31):贪吃蛇游戏(1)
- 使用Qt开发俄罗斯方块游戏(1)
- QTableWidget 导出到表格
- QT5的软键盘输入法实现
- QT一些基本的操作(文件、图片等)
- QT5的软键盘输入法实现
- PyQt5 笔记(03):弹出窗口大全
- 使用 Qt InstallFramework 进行程序打包(一)
- PyQt5 笔记(02):嵌套布局
- PyQt5 笔记(01):嵌套布局