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

转自:http://www.myexception.cn/program/744041.html

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均正常进入,看来问题就出在了重载方法后消息的传递上。


总结:

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

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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值