QListView中使用自定义数据类型的拖放操作
直接写步骤:
- 子类化QStandardItemModel,创建一个model。model中主要重写了dropMimeData、mimeTypes、supportedDropActions等三个函数。dropMimeData实现了对于接收类型的判断,以及对于接收到的数据的添加;mimeTypes返回一个自定义的数据类型名称;supportedDropActions返回支持的拖放动作(Qt::CopyAction | Qt::MoveAction)。
- 子类化QListView,重写了mouseMoveEvent和mousePressEvent。代码如下:
1 // QPoint startPos; 2 void TaskListView::mouseMoveEvent(QMouseEvent *event) 3 { 4 if (event->buttons() & Qt::LeftButton) 5 { 6 int distance = (event->pos() - startPos).manhattanLength(); 7 if (distance >= QApplication::startDragDistance()) 8 { 9 CustomTaskItemData data; 10 data.m_caption = currentIndex().data(Qt::DisplayRole).value(); 11 data.m_icon = currentIndex().data(Qt::DecorationRole).value(); 12 13 TaskItemMimeData* mimeData = new TaskItemMimeData(data); 14 15 QDrag* drag = new QDrag(this); 16 drag->setMimeData(mimeData); 17 18 QVariant icon = currentIndex().data(Qt::DecorationRole); 19 QImage image = icon.value().scaled(QSize(32, 32)); 20 drag->setPixmap(QPixmap::fromImage(image)); 21 22 if (drag->exec(Qt::CopyAction | Qt::MoveAction) == Qt::MoveAction) 23 { 24 m_pModel->removeRow(nOldRow); 25 return; 26 } 27 } 28 } 29 30 QListView::mouseMoveEvent(event); 31 } 32 33 void TaskListView::mousePressEvent(QMouseEvent *event) 34 { 35 if (event->button() == Qt::LeftButton) 36 startPos = event->pos(); 37 38 QListView::mousePressEvent(event); 39 }
- 子类化QMimeData。这个是实现自定义数据的重点,在这个类中要存储需要传递的数据。需要重写formats和retrieveData。代码如下:
TaskItemMimeData::TaskItemMimeData(const CustomTaskItemData& itemData)
{
myCustomData = itemData; // 这个是自定义的数据
myFormats << "application/sprtaskitemdata"; // 这个是自定义的类型标识
}
QStringList TaskItemMimeData::formats() const
{
return myFormats;
}
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">