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);

}

 

posted on 2025-06-17 14:52  飘杨......  阅读(102)  评论(1)    收藏  举报