QAbstractItemModel支持拖拽

接受拖放

继承QAbstractItemModel(根据自己实际情况可继承其他Model)后,重写以下函数(注:需要在view(QTableView等)中开启接受拖放setAcceptDrops(true))

Qt::ItemFlags MyModel::flags(const QModelIndex& index) const
{
    auto defaultFlags = QAbstractTableModel::flags(index);
    return defaultFlags | Qt::ItemIsDropEnabled;      //开启接受拖放
}

QStringList MyModel::mimeTypes() const
{
    return QStringList() << "type1" << "type2";    //支持的拖放数据(MIME)类型
}

//判断是否支持拖放的数据类型
bool MyModel::canDropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent) const
{
    if (!parent.isValid())
        return false;

    QStringList mimeFmts = data->formats();
    for (const QString& fmt : mimeFmts)
    {
        if (fmt.contains("type1") || fmt.contains("type2"))
        {
            return true;
        }
    }
    return QAbstractItemModel::canDropMimeData(data, action, row, column, parent);
}

//返回支持的数据操作
Qt::DropActions MyModel::supportedDropActions() const
{
    return Qt::CopyAction | Qt::MoveAction;
}

//处理拖放的数据
bool MyModel::dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent)
{
    QStringList mimeFmts = data->formats();
    for (const QString& fmt : mimeFmts)
    {
        if (fmt.contains("type1"))
        {
            //添加处理
        }
        else if (fmt.contains("type2"))
        {
            //添加处理
        }
    }   
    return QAbstractItemModel::dropMimeData(data, action, row, column, parent);
}

支持拖拽

继承QAbstractItemModel(根据自己时间情况可继承其他Model)后,重写以下函数(注:需要在view(QTableView等)中开启接受拖放setDragEnabled(true))

Qt::ItemFlags MyModel::flags(const QModelIndex& index) const
{
    auto defaultFlags = QAbstractTableModel::flags(index);
    return defaultFlags | Qt::ItemIsDragEnabled;  //开启拖拽
}

继承QStyledItemDelegate(根据自己时间情况可继承其他Model)后,重写以下函数

bool MyDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
    static QPoint _dragStartPos;
    if (event->type() == QEvent::MouseButtonPress)
    {
        QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
        if (mouseEvent->buttons() & Qt::LeftButton)
        {
            _dragStartPos = mouseEvent->pos();
        }
    }
    else if (event->type() == QEvent::MouseMove)
    {
        QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
        if (mouseEvent->buttons() & Qt::LeftButton)
        {
            if ((mouseEvent->pos() - _dragStartPos).manhattanLength() > QApplication::startDragDistance())
            {
                QDrag* drag = new QDrag((QObject*)option.widget);
                QMimeData* mimeData = new QMimeData;

                QByteArray bytes;
                QDataStream out(&bytes, QIODevice::WriteOnly);
                out << "dragData";    //填充拖拽数据
                mimeData->setData(QString("type1"), bytes);

                drag->setMimeData(mimeData);
                drag->setPixmap(_dragPix);
                drag->exec(Qt::MoveAction);
                mimeData->deleteLater();
                drag->deleteLater();
                return true;
            }
        }
    }
    return QStyledItemDelegate::editorEvent(event, model, option, index);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,797评论 8 265
  • 小编费力收集:给你想要的面试集合 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JA...
    八爷君阅读 10,148评论 1 114
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,795评论 1 32
  • JAVA面试题 1、作用域public,private,protected,以及不写时的区别答:区别如下:作用域 ...
    JA尐白阅读 4,858评论 1 0
  • 用TCP协议发送时,由于TCP是数据流协议,因此不存在包大小的限制(暂不考虑缓冲区的大小) HTTP/2 头压缩算...
    JLong阅读 3,430评论 0 0