QAbstractItemModel支持拖拽

文章详细介绍了如何在Qt环境中,通过继承QAbstractItemModel并重写相关函数来实现表格视图的拖放功能,包括接受拖放、拖拽、数据类型判断及处理。关键步骤包括设置ItemFlags、实现MimeTypes、canDropMimeData、dropMimeData以及editorEvent方法。
摘要由CSDN通过智能技术生成

接受拖放

继承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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值