因为用的是mvc,也不需要设置拖动样式之类的,所以这里不用重写drop的4大操作, 即enter leave move drop。以下内容来自龚建波大佬的测试案例。
QTableView* tableview = new QTableView(this);
//一、tableview拖动设置(默认拖动单元格)
tableview->setDragEnabled(true);
tableview->setSelectionMode(QAbstractItemView::SingleSelection); //拖动行列必选
tableview->setSelectionBehavior(QAbstractItemView::SelectRows); //拖动行
//tableview->setSelectionBehavior(QAbstractItemView::SelectColumns); //拖动列
tableview->setDefaultDropAction(Qt::MoveAction);
tableview->setDragDropMode(QAbstractItemView::InternalMove);
//二、tableview模型拖动设置
Qt::DropActions supportedDropActions() const override;
Qt::DropActions tableModel::supportedDropActions() const
{
return Qt::MoveAction | QAbstractTableModel::supportedDropActions();
}
//drag时携带的信息
QMimeData *mimeData(const QModelIndexList &indexes) const override;
QMimeData *tableModel::mimeData(const QModelIndexList &indexes) const
{
QMimeData *data=QAbstractTableModel::mimeData(indexes);
if(data){
// parent mimeData中已判断indexes有效性,无效的会返回nullptr
data->setData("row",QByteArray::number(indexes.at(0).row()));
//data->setData("col",QByteArray::number(indexes.at(0).column()));
}
return data;
}
//drop时根据drag携带的信息进行的处理
bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override;
bool tableModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
{
if(!data||action!=Qt::MoveAction)
return false;
//这里直接根据drag携带的行信息data->data("row").toInt() 和新的行信息parent.row()
//对model 中的数据列表m_dataList对应数据 进行顺序交换
m_dataList->swap(data->data("row").toInt(),parent.row());
return true;
}
代码链接 GitHub:https://gitee.com/ITDogPq/proj-test/tree/master/qt/QTableViewMoveAction