想要使tableWidget进行拖放并且进行位置的交换,只需要两步:
1.打开tableWidget的使能
///注册事件过滤器
ui.tableWidget->viewport()->installEventFilter(this);
拖放使能
ui.tableWidget->setDragDropMode(QAbstractItemView::DragDrop);
ui.tableWidget->setDragEnabled(true);
ui.tableWidget->setAcceptDrops(true);
ui.tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //以行为单位
ui.tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); //不能编辑行内容
2.实现:
bool MITSVIRouteConfig::eventFilter(QObject *obj, QEvent *eve)
{
if(obj == ui.tableWidget->viewport())
{
if(eve->type() == QEvent::Drop)
{
const QMimeData *mime = ((QDropEvent*)eve)->mimeData();
QByteArray encodedata = mime->data("application/x-qabstractitemmodeldatalist");
if (encodedata.isEmpty())
{
return false;
}
QDataStream stream(&encodedata, QIODevice::ReadOnly);
while (!stream.atEnd())
{
int row, col;
QMap<int, QVariant> roleDataMap;
///拖的row和col
stream >> row >> col >> roleDataMap;
QTableWidgetItem* pDropItem = ui.tableWidget->itemAt(((QDropEvent*)eve)->pos());
if(!pDropItem)
{
return true;
}
//放的row
if(pDropItem->row() == row)
{
return true;
}
///自己的实现TODO:
return true; //不要交给系统处理,否则他会给你新增一行
}
}else
{
return QWidget::eventFilter(obj,eve);
}
}
return QWidget::eventFilter(obj,eve);
}
这两部分是从我们项目中摘的,拷贝之后可以根据自己的情况修改,所有需要的参数已经