#include "qmytablewidget.h" #include #include #include #include #include #include #include "CallManage.h" #include "PropertyWidget.h" //针对道 QMyTableWidget::QMyTableWidget(QWidget *parent) : QTableWidget(parent) { //setSelectionBehavior(QAbstractItemView::SelectColumns); //拖动列 setAcceptDrops(true); connect(this, SIGNAL(sig_columnDragged(int, int)), this, SLOT(s_columnDragged(int, int))); connect(this, SIGNAL(itemSelectionChanged()), this, SLOT(ChangedItem())); } void QMyTableWidget::mousePressEvent(QMouseEvent *event) { qDebug()<<"QMyTableWidget mousePressEvent"; if(event->button() == Qt::LeftButton) { startPos = event->pos(); // m_press = true;//鼠标按下的标志 // m_draging = false;//鼠标左键释放的标志 // m_selectRow = this->rowAt(event->y());//通过QtableWidget的row(at)记录按下的位置 //m_selectCol = this->columnAt(event->x());//每一列都有一个逻辑值即logicIndex;这个逻辑值是不会变的 m_selectCol = this->visualColumn(this->columnAt(event->x()));//格上面看见的列在第几列,那个值就是visualIndex } QTableWidget::mousePressEvent(event); } void QMyTableWidget::ChangedItem() { qDebug()<<"QMyTableWidget itemSelectionChanged!"; } void QMyTableWidget::mouseMoveEvent(QMouseEvent *event) { qDebug()<<"QMyTableWidget mouseMoveEvent"; if (event->buttons() & Qt::LeftButton) { int distance = (event->pos() - startPos).manhattanLength(); if (distance >= QApplication::startDragDistance()) { performDrag(); } } QTableWidget::mouseMoveEvent(event); } void QMyTableWidget::dragEnterEvent(QDragEnterEvent *event) { qDebug()<<"QMyTableWidget dragEnterEvent"; QMyTableWidget *source = qobject_cast(event->source()); if (source && source == this) { event->setDropAction(Qt::MoveAction); event->accept(); } } void QMyTableWidget::dragMoveEvent(QDragMoveEvent *event) { qDebug()<<"QMyTableWidget dragMoveEvent"; QMyTableWidget *source = qobject_cast(event->source()); if (source && source == this) { event->setDropAction(Qt::MoveAction); event->accept(); } } void QMyTableWidget::dropEvent(QDropEvent *event) { qDebug()<<"QMyTableWidget dropEvent"; QMyTableWidget *source = qobject_cast(event->source()); if (source && source == this) { QString strExtern = event->mimeData()->text(); if(strExtern != "") { m_hoverCol = this->visualColumn(this->columnAt(event->pos().x()));//格上面看见的列在第几列,那个值就是visualIndex // if(m_selectCol != m_hoverCol && m_selectCol>=0 && m_hoverCol>=0)//判断两个位置是否相等 { //emit sig_columnDragged(m_selectCol, m_hoverCol); s_columnDragged(m_selectCol, m_hoverCol); } // 接受拖拽事件 event->setDropAction(Qt::MoveAction); event->accept(); } else { // 如果井名不正确,不接受拖拽事件 event->ignore(); } } } void QMyTableWidget::s_columnDragged(int from, int to) { qDebug()<<"QMyTableWidget s_columnDragged, from=" << QString::number(from) << ", to=" << QString::number(to); this->horizontalHeader()->moveSection(from, to); // 移动列的实际操作,注意这里的to是目标索引,不是偏移量,所以不需要加1。 } void QMyTableWidget::mouseReleaseEvent(QMouseEvent *event) { if(m_press)//如果鼠标左键被释放 { qDebug()<<"QMyTableWidget mouseReleaseEvent"; m_press = false;//按下标志置fasle,形成互斥 int iCurrentRow = currentRow(); qDebug()<<"QMyTableWidget mouseReleaseEvent, iCurrentRow=" << QString::number(iCurrentRow); if(iCurrentRow<0) { //未选中 PropertyService()->initWidgetProperty(); } } } //void QMyTableWidget::mouseReleaseEvent(QMouseEvent *event) //{ // qDebug()<<"QMyTableWidget mouseReleaseEvent"; // if(m_press)//如果鼠标左键被释放 // { // qDebug()<<"QMyTableWidget m_draging"; // m_press = false;//按下标志置fasle,形成互斥 // m_hoverRow = this->rowAt(event->y());//记录释放时,鼠标的位置 // //m_hoverCol = this->columnAt(event->x());//每一列都有一个逻辑值即logicIndex;这个逻辑值是不会变的 // m_hoverCol = this->visualColumn(this->columnAt(event->x()));//格上面看见的列在第几列,那个值就是visualIndex // // // if(m_selectCol != m_hoverCol && m_selectCol>=0 && m_hoverCol>=0)//判断两个位置是否相等 // { // //emit sig_columnDragged(m_selectCol, m_hoverCol); // s_columnDragged(m_selectCol, m_hoverCol); // } // } //// QTableWidget::mouseReleaseEvent(event);//增加这一行鼠标每次删除释放都会自动增加一行item //} //void itemSelectionChanged() //{ // if(m_selectRow != m_hover)//判断两个位置是否相等 // { // QTableWidgetItem *olditem =takeItem(m_selectRow,0);//获取两个item的内容 // QTableWidgetItem *currentItem=takeItem(m_hover,0); // setItem(m_selectRow,0,currentItem);//交换两个位置的内容 // setItem(m_hover,0,olditem); // } //} void QMyTableWidget::performDrag() { qDebug()<<"QMyTableWidget performDrag!"; if(!currentItem()) { return; } QString strExtern = currentItem()->text(); QMimeData *mimeData = new QMimeData; mimeData->setText(strExtern); QDrag *drag = new QDrag(this); drag->setMimeData(mimeData); // 可以设置拖拽时的光标图标 QRect itemRect = visualItemRect(currentItem()); // 获取项的矩形区域 QPixmap itemPixmap = QWidget::grab(itemRect);//QPixmap::grabWidget(this, itemRect); // 获取项的屏幕截图 // 调整拖拽光标的热点,使其位于截图的中心 drag->setPixmap(itemPixmap); // 执行拖拽操作 Qt::DropAction dropAction = drag->exec(Qt::MoveAction); if (dropAction == Qt::MoveAction) { // } }