QTableView派生类重载dropEvent方法无效的解决方法

转载请注明出处,谢谢!

由于需要用到一个QTableView进行数据内容的显示,同时希望view能支持Drag和Drop的操作,而Drag的数据源可能来自其他view也可能是自身的,需要做一些转换处理,所以,通过QTableView派生自定义类的方式来 重载dropEvent方法,在该方法中进行一些处理。


直接看代码:

class MyTabelView : public QTableView
{
public:
    MyTabelView(QWidget *parent=0);
 
 
    void dragEnterEvent(QDragEnterEvent *event);
    void dropEvent(QDropEvent *event);
    void dragMoveEvent(QDragMoveEvent *event);
};


刚开始即使用了google搜索,搜索到此类问题的解决办法,找到的内容中强调dragEnterEvent、dropEvent、dragMoveEvent 三个方法均需要重载,同时,在派生类的构造函数中setAcceptDrops(true);

于是实现:

MyTabelView::MyTabelView(QWidget *parent) : QTableView(parent)
{
 setAcceptDrops(true);
 setDragDropMode(QAbstractItemView::DragDrop);
 setDragEnabled(true);
 setDropIndicatorShown(true);
}
 
 
void MyTabelView::dropEvent(QDropEvent *event)
{
 qDebug() << "drag droped";
}
 
 
void MyTabelView::dragEnterEvent(QDragEnterEvent *event)
{
 qDebug() << "drag entered";
}
 
 
void MyTabelView::dragMoveEvent(QDragMoveEvent *event)
{
 qDebug() << "drag moved";
}

编译通过后,试了一下,只有dragentered消息进入,move及drop均没有进入,实在想不明白是何道理,该实现的方式均实现了。当然遇到这种问题,最快捷的方式,还是搜索,但找到的信息寥寥,大多数都止于重载这三个方法即可。 但其中有一篇文章中提到,这类ViewWidget大部分都集成了基类的三种方法,或者都进行了重载。

从这其中我想到一个问题,既然QTableView基类已经实现了此三种方法,那么在派生类中中MyTabelView::dragEnterEvent 实现方式是否应该将接收到的消息传递继续下去?如果不传递下去会是什么样?于是:

void MyTabelView::dragEnterEvent(QDragEnterEvent *event)
{
    qDebug() << "drag entered";
    QTableView::dragEnterEvent(event);
}

经过测试,drop及move均正常进入,看来问题就出在了重载方法后消息的传递上。


总结:

对于有消息传递的方法的重载,如果该消息还有后续操作需要实现,在重载方法的最后,应该明确调用基类的方法进行消息的传递。

纯个人总结,可能有错误之处,还请网友发现后给予指正,谢谢!

你可能感兴趣的:(Google,测试,Class)