QTableWidget
首先对控件进行设置
//注册事件过滤器
pTableWidget->viewport()->installEventFilter(this);
//拖放使能
pTableWidget->setDragDropMode(QAbstractItemView::DragDrop);
pTableWidget->setDragEnabled(true);
pTableWidget->setAcceptDrops(true);
pTableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //以行为单位
其中 pTableWidget 是主界面的一个 QTableWidget
然后要重写eventFilter(QObject *obj, QEvent *eve)
bool AClass::eventFilter(QObject *obj, QEvent *eve)
{
//因为我的界面上有两个 QTableWidget 所以这里要判断一下是哪个发的信号
QTableWidget *tableWidget =nullptr;
if (obj == ui.tableWidget->viewport())
{
tableWidget = ui.tableWidget;
}
else if(obj == ui.pTableWidReview->viewport())
{
tableWidget = ui.pTableWidReview;
}
else
{
return QWidget::eventFilter(obj, eve);
}
if (eve->type() == QEvent::Drop && tableWidget)
{
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 = tableWidget->itemAt(((QDropEvent*)eve)->pos());//按住拖动的那一行
if (!pDropItem)
{
return true;
}
//放的row
if (pDropItem->row() == row)
{
return true;
}
///自己的实现TODO:
TableWidgeSwapLine(tableWidget, pDropItem->row(), row);
return true; //不要交给系统处理,否则他会给你新增一行
}
}
return QWidget::eventFilter(obj, eve);
}
最后是交换两行的数据
void AClass::TableWidgeSwapLine(QTableWidget *pTableWidget, int source, int destination)
{
QStringList sourceList, desList;
for (int i = 0; i < pTableWidget->columnCount(); i++)
{
sourceList<<pTableWidget->item(source, i)->data(Qt::DisplayRole).toString();
desList << pTableWidget->item(destination, i)->data(Qt::DisplayRole).toString();
}
for (int i = 0; i < pTableWidget->columnCount(); i++)
{
pTableWidget->item(source, i)->setData(Qt::DisplayRole, desList.at(i));
pTableWidget->item(destination, i)->setData(Qt::DisplayRole, sourceList.at(i));
}
}
完成
QListWidget
QListWidget 的拖拽比较简单
pListWidget->setMovement(QListView::Free);//元素可以自由拖拽
pListWidget->setDragDropMode(QAbstractItemView::InternalMove);