表格拖拽更改顺序

1、继承QAbstractTableModel,重写以下函数

myTableModel.h

   // 允许的操作,加上drag drop
    Qt::ItemFlags flags(const QModelIndex &index) const override;
    // 允许move
    Qt::DropActions supportedDropActions() const override;
    // drag时携带的信息
    QMimeData *mimeData(const QModelIndexList &indexes) const override;
    // drop时根据drag携带的信息进行处理
    bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override;

myTableModel.cpp

Qt::ItemFlags MyTableModel::flags(const QModelIndex &index) const
{
    if (index.isValid())
        return Qt::ItemIsDragEnabled  | Qt::ItemIsDropEnabled  | QAbstractTableModel::flags(index);
    return QAbstractTableModel::flags(index);
}

Qt::DropActions MyTableModel::supportedDropActions() const
{
    return Qt::MoveAction | QAbstractTableModel::supportedDropActions();
}

QMimeData *MyTableModel::mimeData(const QModelIndexList &indexes) const
{
    QMimeData *data = QAbstractTableModel::mimeData(indexes);
    if(data){
        data->setData("row",QByteArray::number(indexes.at(0).row()));
    }
    return data;
}

bool MyTableModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
{
    if(!data || action!=Qt::MoveAction || !parent.isValid())
        return false;

    emit moveRowSignal(data->data("row").toInt(), parent.row());//发送信号修改顺序
    return true;
}

2、修改拖拽样式 

继承QProxyStyle,重写drawPrimitive函数

void MyTableStyle::drawPrimitive (PrimitiveElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget) const{
    QStyleOption opt(*option);
    if (element == QStyle::PE_IndicatorItemViewItemDrop && !option->rect.isNull()){
        opt.rect.setLeft(0);
        opt.rect.setRight(m_dropStyleWidth);//表格宽度
        QPen pen = painter->pen();
        pen.setColor("#277BFF");
        painter->setPen(pen);
    }
    QProxyStyle::drawPrimitive(element, &opt, painter, widget);
}

为tableView设置style

MyTableStyle tableSyle = new MyTableStyle(this);
tableView->setStyle(tableSyle);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值