• 9084阅读
  • 1回复

QTableWidget 's drag and drop [已解决] [复制链接]

上一主题 下一主题
离线yanzhuliang
 

只看楼主 正序阅读 楼主  发表于: 2010-10-29
— 本帖被 XChinux 执行加亮操作(2010-10-29) —
遇到一件非常诡异的事情,我写了一个QTableWidget 的子类,希望能处理drag and drop。但是无论如何也无法触发dragLeaveEvent、dragMoveEvent、dropEvent,只能触发dragEnterEvent。仔细看了QT的examples\draganddrop中的例子,其中的基类都是QLabel、QWidget、QFrame!!只要我把自己写的子类的基类换成QLabel、QWidget、QFrame中的任意一个,都可以成功触发dragLeaveEvent、dragMoveEvent、dropEvent。两天了,两天了,怎么就一点门儿没有呢??

我的代码如下:
/////////////////////////////////////////////////////////////////////
// 头文件
/////////////////////////////////////////////////////////////////////
#ifndef SCRIPTEDIT_H
#define SCRIPTEDIT_H
#include <QTableWidget>
class ScriptEdit : public QTableWidget
{
 Q_OBJECT
public:
 ScriptEdit(QWidget *parent = 0);
 ~ScriptEdit();
protected:
 void dragEnterEvent(QDragEnterEvent *event);
 void dragLeaveEvent(QDragLeaveEvent *event);
 void dragMoveEvent(QDragMoveEvent *event);
 void dropEvent(QDropEvent *event);
 void mousePressEvent(QMouseEvent *event);
private:
};
#endif // SCRIPTEDIT_H


/////////////////////////////////////////////////////////////////////
// 源文件
/////////////////////////////////////////////////////////////////////
#include "scriptedit.h"
#include <QDebug>
ScriptEdit::ScriptEdit(QWidget *parent)
 : QTableWidget(parent)
{
 QStringList labels;
 labels << tr("Step")
  << tr("Comment");
 setColumnCount(2);
 setHorizontalHeaderLabels(labels);
 setAcceptDrops(true);
 setDragEnabled(true);
 setDragDropMode(QAbstractItemView::DragDrop);
 setDropIndicatorShown(true);
 setEditTriggers(QAbstractItemView::DoubleClicked);
}
ScriptEdit::~ScriptEdit()
{
}
void ScriptEdit::dragEnterEvent(QDragEnterEvent *event)
{
    qDebug() <<"drag enter" <<endl;
}
void ScriptEdit::dragLeaveEvent(QDragLeaveEvent *event)
{
    qDebug() <<"drag leave" <<endl;
}
void ScriptEdit::dragMoveEvent(QDragMoveEvent *event)
{
     qDebug() <<"drag move" <<endl;
}
void ScriptEdit::dropEvent(QDropEvent *event)
{
    qDebug() <<"drop" <<endl;
}
void ScriptEdit::mousePressEvent(QMouseEvent *event)
{
    qDebug() <<"mouse press" <<endl;
}
[ 此帖被yanzhuliang在2010-11-01 17:18重新编辑 ]
离线yanzhuliang

只看该作者 1楼 发表于: 2010-10-30
实验无数次,总算暂时解决了这个问题,不过还是不得其中。方法如下:

必须在dragEnterEvent中加入下面的代码,才能进一步触发dragLeaveEvent、dragMoveEvent、dropEvent。
void ScriptEdit::dragEnterEvent(QDragEnterEvent *event)
{
    if (event->mimeData()->hasText())     //这里视自己的情况可以是hasColor、hasFormat、hasHtml等
    {
        if (event->source() == this)
        {
            event->setDropAction(Qt::MoveAction);
            event->accept(); 

            // TODO:处理内部拖曳
        }
        else
        {
            event->acceptProposedAction(); 

            //TODO:处理外部的drag,即接受drop
        } 
    }
    else
    {
        event->ignore();
    }
}


快速回复
限100 字节
 
上一个 下一个