QT使用drag实现视频播放列表拖拽至显示区指定位置播放
实现效果
将素材列表展示的视频项拖拽至显示框内播放。
实现过程
实现思路
- 鼠标按下选中素材列表listWidget的item,自定义MyListWidget继承自listWidget重写鼠标事件
- 鼠标按下获取当前item,鼠标移动创建QDrag类,传递QMimeData拖拽数据,也即item绑定的数据,如播放地址
- 再在自定义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的数据,再调用播放函数对素材进行指定位置的播放。