QListView使用自定义的拖放操作

QListView中使用自定义数据类型的拖放操作

直接写步骤:

  1. 子类化QStandardItemModel,创建一个model。model中主要重写了dropMimeData、mimeTypes、supportedDropActions等三个函数。dropMimeData实现了对于接收类型的判断,以及对于接收到的数据的添加;mimeTypes返回一个自定义的数据类型名称;supportedDropActions返回支持的拖放动作(Qt::CopyAction | Qt::MoveAction)。
  2. 子类化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
  1. 子类化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;">

原文地址:https://www.cnblogs.com/yunhaisoft/p/7325595.html