QTableWidget 實現整行拖放交換位置
阿新 • • 發佈:2019-02-01
想要使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); }
這兩部分是從我們專案中摘的,拷貝之後可以根據自己的情況修改,所有需要的引數已經