在QTableWidget或者QTreeWidget实现拖拽功能时,有时需要自定义或者某些特定的逻辑条件才能接受拖拽的数据,这时候可能就要解析拖拽中的QMimeData的数据。默认拖拽的QMimeData的类型formats是application/x-qabstractitemmodeldatalist。可以通过QMimeData::data ( const QString & mimeType ) 方法获取对应类型的数据。对应的数据解析如下
void MTableWidget::dragMoveEvent( QDragMoveEvent *event )
{
qDebug() << "formats: "<< event->mimeData()->formats().join(",");
QByteArray itemData= event->mimeData()->data("application/x-qabstractitemmodeldatalist");
QDataStream stream(&itemData, QIODevice::ReadOnly);
int row,col;
QMap<int, QVariant> roleDataMap;
while (!stream.atEnd())
{
stream >> row >> col >> roleDataMap;
qDebug() << "row: " << row << " col :" << col << " data:"<< roleDataMap ;
}
//
//dosomething();
//
}
解析出来的QMap<int, QVariant> roleDataMap的数据对应的是item利用setData设置。Qt::ItemDataRole 和 自定义的值
加载数据是设置如下
item->setData(Qt::UserRole,i);
item->setData(Qt::UserRole+1,j);
打印如下
注意:对应QTreeWidget如果拖拽的row代表的含义是在其父item的第几行
对于QTableView、QTreeView、QTreeWidget也是如此
参考:http://www.voidcn.com/article/p-hnfiowoo-btw.html
如果是自己定义的formats类型可以参考
https://doc.qt.io/qt-5/qtwidgets-draganddrop-draggableicons-example.html