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

本文介绍了解决QTableView派生类中dropEvent方法重载无效的问题。通过正确地传递事件给基类,确保了drag和drop操作正常工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


总结:

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

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


在使用 QTableView 进行行拖拽时,你可以重写以下几个事件来实现拖拽行的功能:`dragEnterEvent`、`dropEvent` `dragMoveEvent`。 1. dragEnterEvent:当拖动对象进入 QTableView 区域时触发该事件。你可以在该事件中判断拖动的对象是否是可接受的类型,并设置接受拖放操作。 ```cpp void YourTableView::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist")) { event->acceptProposedAction(); } } ``` 2. dropEvent:当拖动对象在 QTableView 区域内释放时触发该事件。你可以在该事件中处理拖放操作,例如获取拖动的行数据并进行相应的处理。 ```cpp void YourTableView::dropEvent(QDropEvent *event) { const QMimeData *mimeData = event->mimeData(); if (mimeData->hasFormat("application/x-qabstractitemmodeldatalist")) { QByteArray encodedData = mimeData->data("application/x-qabstractitemmodeldatalist"); QDataStream stream(&encodedData, QIODevice::ReadOnly); while (!stream.atEnd()) { int row, col; QMap<int, QVariant> roleDataMap; stream >> row >> col >> roleDataMap; // 处理拖放操作,例如插入数据到指定位置 // ... } event->acceptProposedAction(); } } ``` 3. dragMoveEvent:当拖动对象在 QTableView 区域内移动时触发该事件。你可以在该事件中设置合适的反馈操作,例如更改光标的形状。 ```cpp void YourTableView::dragMoveEvent(QDragMoveEvent *event) { if (event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist")) { event->setDropAction(Qt::MoveAction); event->accept(); } } ``` 记得在你的自定义 QTableView 类中重写这些事件,并将其设置为可接受拖放操作。这样,你就可以实现 QTableView 的行拖拽功能了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值