Qt QWidget中dropEvent(QDropEvent* e)拖拽放开不接收事件/不执行,且拖拽到目标后鼠标显示禁用符号
一、概述
场景还原:
在做视频多路视频监控项目的时候,需要用户拖动相机然后在拖拽放开后展示相机数据(视频画面)。现遇到一个问题,拖拽没问题,就是无法放下,切鼠标显示禁用符号。
即:dropEvent(QDropEvent* e)方法不执行。也不报错。
ps:Qt版本用的是:5.12.0
二、解决办法
在在定义的QWidget中重载了两个方法
//拖拽进入 void dragEnterEvent(QDragEnterEvent* e) override; //拖拽松开 void dropEvent(QDropEvent* e) override;
其中 void dragEnterEvent(QDragEnterEvent* e)方法执行了。 void dropEvent(QDropEvent* e)方法不执行。也就是能拖过来,但是无法松开(鼠标显示禁用符号)
Qt版本用的是:5.12.0
解决办法是:
把配套的void dragMoveEvent(QDragMoveEvent* e)方法也重载一下。即要有拖进、拖拽移动、拖动放开这三个动作。
完整示例代码如下:
YCameraWidget::YCameraWidget(QWidget* p) :QWidget(p) { //接收拖拽 this->setAcceptDrops(true); } //拖拽进入 void YCameraWidget::dragEnterEvent(QDragEnterEvent* e) { //接收拖拽进入 e->acceptProposedAction(); } void YCameraWidget::dragMoveEvent(QDragMoveEvent* e) { e->setDropAction(Qt::CopyAction); e->accept(); } //拖拽松开 void YCameraWidget::dropEvent(QDropEvent* e) { //拿到url qDebug() << e->source()->objectName(); auto wid = (QListWidget*)e->source(); qDebug() << wid->currentRow(); auto cam = YCameraConfig::Create()->GetCamera(wid->currentRow()); Open(cam.sub_url); }