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 }
View Code