logplus/logPlus/qmytablewidget.cpp
2025-10-29 17:23:30 +08:00

202 lines
6.3 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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