Qtreeview如何把Qtreeview的数据拖曳到QPushbutton上

大陈1108 2014-03-31 11:37:10
Qtreeview如何把Qtreeview的数据拖曳到QPushbutton上,现在问题是有时拖不成功。请指教。

已下是部分源码。

// QTreewidget是继承QTreeview
#include "treewidget.h"
#include <QDebug>

QMimeData *g_mimeData;

TreeWidget::TreeWidget(QWidget *parent)
: QTreeView(parent)
{
this->setAcceptDrops(false);
this->setDragEnabled(false);
g_mimeData = NULL;
}

TreeWidget::~TreeWidget()
{

}

void TreeWidget::mousePressEvent(QMouseEvent *event)
{
//qDebug()<<"mousePressEvent";
if (event->button() == Qt::LeftButton)
m_startPos = event->pos();
QTreeView::mousePressEvent(event);
}

void TreeWidget::mouseMoveEvent(QMouseEvent *event)
{
//qDebug()<<"mouseMoveEvent";
if (event->buttons() & Qt::LeftButton)
{
int distance = (event->pos() - m_startPos).manhattanLength();
qDebug()<<"distance"<<distance<<"QApplication::startDragDistance()"<<QApplication::startDragDistance();
if (distance >= QApplication::startDragDistance())
performDrag();
}
QTreeView::mouseMoveEvent(event);
}

void TreeWidget::dragEnterEvent(QDragEnterEvent *event)
{
TreeWidget *source = qobject_cast<TreeWidget *>(event->source());
if (source && source != this)
{
//event->acceptProposedAction();
event->setDropAction(Qt::MoveAction);
event->accept();
}
}

void TreeWidget::dragMoveEvent(QDragMoveEvent *event)
{
//qDebug()<<"dragMoveEvent";

TreeWidget *source = qobject_cast<TreeWidget *>(event->source());
if (source && source != this)
{
//event->acceptProposedAction();
event->setDropAction(Qt::MoveAction);
event->accept();
}
QTreeView::dragMoveEvent(event);
}

void TreeWidget::dropEvent(QDropEvent *event)
{
//qDebug()<<"dropEvent";
TreeWidget *source = qobject_cast<TreeWidget *>(event->source());
if (source && source != this)
{
event->setDropAction(Qt::MoveAction);
event->accept();
}
}

void TreeWidget::performDrag()
{
//qDebug()<<"performDrag";
QModelIndex index = currentIndex();
if (index.isValid())
{

QString str = index.data(Qt::DisplayRole).toString();
//qDebug()<<str;

g_mimeData = new QMimeData;
g_mimeData->setText(str);

QDrag *drag = new QDrag(this);
drag->setMimeData(g_mimeData);
drag->setPixmap(QPixmap(":/images/person.png"));
if (drag->exec(Qt::MoveAction) == Qt::MoveAction)
{// delete item;

}
//drag->exec(Qt::MoveAction | Qt::CopyAction);
}
}

// QDropButton继承QPushbutton
#include "dropbutton.h"
#include <QDebug>

extern QMimeData *g_mimeData;

DropButton::DropButton(QWidget *parent)
: QPushButton(parent)
{
ui.setupUi(this);

setAcceptDrops(true);
// installEventFilter(this);
}

DropButton::~DropButton()
{

}

void DropButton::setInfo(QString str)
{
this->setText(str);
}


//bool DropButton::eventFilter(QObject * obj, QEvent * event)
//{
// if (event->type() == QEvent::DragEnter)
// {
// QDragEnterEvent *dee = dynamic_cast<QDragEnterEvent *>(event);
// dee->acceptProposedAction();
// setBackgroundRole(QPalette::Highlight);
// emit changed(dee->mimeData());
// return true;
// }
// else if (event->type() == QEvent::Drop)
// {
// QDropEvent *de = dynamic_cast<QDropEvent *>(event);
// QString str = de->mimeData()->text();
// setInfo("123");
// return true;
// }
// return QWidget::eventFilter(obj, event);
//
//}

void DropButton::dragEnterEvent(QDragEnterEvent *event)
{
//qDebug()<<"dragEnterEvent button";
event->acceptProposedAction();
QString str = event->mimeData()->text();
}

void DropButton::dragMoveEvent(QDragMoveEvent *event)
{
//qDebug()<<"dragMoveEvent button";
event->acceptProposedAction();
}

void DropButton::dropEvent(QDropEvent * event)
{
if (g_mimeData != NULL)
{
QString str = g_mimeData->text();
setInfo(str);
g_mimeData->setText("");
//g_mimeData->setData(0);
//delete g_mimeData;
g_mimeData = NULL;
}
}
...全文
175 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧