logplus/logPlus/qmytablewidget.cpp

202 lines
6.3 KiB
C++
Raw Normal View History

2025-10-29 17:23:30 +08:00
#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) {
//
}
}