QT使用drag实现视频播放列表拖拽至显示区指定位置播放

实现效果

将素材列表展示的视频项拖拽至显示框内播放。
在这里插入图片描述

实现过程

实现思路

  1. 鼠标按下选中素材列表listWidget的item,自定义MyListWidget继承自listWidget重写鼠标事件
  2. 鼠标按下获取当前item,鼠标移动创建QDrag类,传递QMimeData拖拽数据,也即item绑定的数据,如播放地址
  3. 再在自定义viewform类里面添加drag事件,当拖拽放下获取QMimeData数据,根据路径进行视频播放后续操作。

代码实现

MyListWidget类对鼠标事件的重写

MyListWidget继承自ListWidget,主要重写鼠标按下和鼠标移动事件:

//.h文件
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void MyListWidget::mousePressEvent(QMouseEvent *event)
{
        QPoint endPos = event->pos();
        qDebug() << endPos;
        dragPosition=event->pos();
        dragItem=this->*itemAt(event->pos());
        //保持父类继承下来的按键行为
        QListWidget::mousePressEvent(event);
        qDebug() << "鼠标左键按下";
}
void MyListWidget::mouseMoveEvent(QMouseEvent *event)
{
    if(!(event->buttons()&Qt::LeftButton))
        return;
    //误操作判断
    if((event->pos()-dragPosition).manhattanLength()<QApplication::startDragDistance())
        return;
    if(!dragItem)
        return;
    QDrag *drag=new QDrag(this);
    QMimeData *mimeData=new QMimeData;
    //QStringList dir = QDir::searchPaths(currentItem()->data(Qt::UserRole));
    mimeData->setText(currentItem()->data(Qt::UserRole).toString());
    drag->setMimeData(mimeData);
    qDebug() << "鼠标移动"<<currentItem()->text();
    drag->exec(Qt::CopyAction|Qt::MoveAction);
}

根据鼠标按下时的相对坐标判断当前的item项,增加了一个误操作判断。在QT中拖拽主要主要围绕着QDrag类实现,通过拖拽来交换的数据包含在一个QMimeData对象中,这个对象通过setMimeData()来制定。然后获取item绑定的值,使用setData()实现:

item->setData(Qt::UserRole,filePath); //素材路径
item->setData(Qt::UserRole+1,file.fileName()); //素材原始名

自定义ViewForm类对drag事件重写

拖拽进入、拖拽移动、拖拽放下:

void dragEnterEvent(QDragEnterEvent *event);
void dropEvent(QDropEvent* event);
void dragMoveEvent(QDragMoveEvent *event);
void ViewForm::dragEnterEvent(QDragEnterEvent *event)
{
    qDebug() << "拖拽进入 ";
    if(event->mimeData()->hasFormat("text/plain")){
    event->acceptProposedAction();
    }
}
void ViewForm::dragMoveEvent(QDragMoveEvent *event)
{
    event->accept();
}
void ViewForm::dropEvent(QDropEvent *event)
{
    qDebug() << "拖拽放下 ";
    if (event->mimeData()->hasFormat("text/plain"))
    {
        QPoint endPos = event->pos();
        QString text=event->mimeData()->text();
        playMaterial(text,endPos);
        qDebug() << endPos;
    }
}

拖拽放下获取mimeData的数据,再调用播放函数对素材进行指定位置的播放。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值