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);