1. 程式人生 > >QTableWidget 實現整行拖放交換位置

QTableWidget 實現整行拖放交換位置

想要使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);
}


這兩部分是從我們專案中摘的,拷貝之後可以根據自己的情況修改,所有需要的引數已經