202 lines
6.3 KiB
C++
202 lines
6.3 KiB
C++
|
|
#include "qmytablewidget.h"
|
|||
|
|
#include <QMouseEvent>
|
|||
|
|
#include <QDebug>
|
|||
|
|
#include <QApplication>
|
|||
|
|
#include <QMimeData>
|
|||
|
|
#include <QDrag>
|
|||
|
|
#include <QWidget>
|
|||
|
|
|
|||
|
|
#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<QMyTableWidget *>(event->source());
|
|||
|
|
if (source && source == this) {
|
|||
|
|
event->setDropAction(Qt::MoveAction);
|
|||
|
|
event->accept();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void QMyTableWidget::dragMoveEvent(QDragMoveEvent *event)
|
|||
|
|
{
|
|||
|
|
qDebug()<<"QMyTableWidget dragMoveEvent";
|
|||
|
|
|
|||
|
|
QMyTableWidget *source = qobject_cast<QMyTableWidget *>(event->source());
|
|||
|
|
if (source && source == this) {
|
|||
|
|
event->setDropAction(Qt::MoveAction);
|
|||
|
|
event->accept();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void QMyTableWidget::dropEvent(QDropEvent *event)
|
|||
|
|
{
|
|||
|
|
qDebug()<<"QMyTableWidget dropEvent";
|
|||
|
|
|
|||
|
|
QMyTableWidget *source = qobject_cast<QMyTableWidget *>(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) {
|
|||
|
|
//
|
|||
|
|
}
|
|||
|
|
}
|