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) {
|
||
//
|
||
}
|
||
}
|