Qtreeview如何把Qtreeview的数据拖曳到QPushbutton上
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;
}
}