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);
}


这两部分是从我们项目中摘的,拷贝之后可以根据自己的情况修改,所有需要的参数已经


猜你喜欢

转载自blog.csdn.net/huangyifei_1111/article/details/50820523