zoukankan      html  css  js  c++  java
  • 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;">

  • 相关阅读:
    java基础(8)---接口和lambda
    asp.net ashx处理程序中switch case的替代方案总结
    C# 委托(delegate)、泛型委托和Lambda表达式
    js判断浏览器是否安装或启用了flash的方法总结
    ASP.NET登录验证码解决方案
    C#读取匿名对象的属性值的方法总结
    C#中char[]与string之间的转换;byte[]与string之间的转化
    【Sublime】Sublime 常用插件
    js ajax设置和获取自定义header信息的方法总结
    .Net 通过设置Access-Control-Allow-Origin来实现跨域访问
  • 原文地址:https://www.cnblogs.com/yunhaisoft/p/7325595.html
Copyright © 2011-2022 走看看