logplus/logPlus/formhead.cpp
2025-11-12 17:07:27 +08:00

482 lines
15 KiB
C++

#include "formhead.h"
#include "ui_formhead.h"
#include <QMessageBox>
#include <QDebug>
#include <QMenu>
#include <QClipboard>
#include "CallManage.h"
#include <QTimer>
#include <QSvgRenderer>
#include <QLabel>
#include "backgrounddelegate.h"
#include "PropertyWidget.h"
//extern int g_iRows;
//extern int g_iCols;
int g_iFixedWidth=40;
int g_iFixedHeight=30;
int g_iColsWidth=100;
int g_iRowsHight=40;
extern double g_dPixelPerCm;//每厘米像素数
//画图头
FormHead::FormHead(QWidget *parent, int indexID) :
QWidget(parent),
ui(new Ui::FormHead)
{
ui->setupUi(this);
m_indexID =indexID;
//设置样式表,不显示竖直边框
ui->tableWidget->setStyleSheet( "QTableView::item {border-left: 0px solid black;} \
QTableView::item:selected {border-left: 0px solid black;}\
QTableView::item {border-right: 0px solid black;} \
QTableView::item:selected {border-right: 0px solid black;}");
//
//ui->tableWidget->verticalHeader()->hide(); //行
//ui->tableWidget->horizontalHeader()->hide(); //列
ui->tableWidget->verticalHeader()->setFixedWidth(g_iFixedWidth);//标题栏宽度
ui->tableWidget->horizontalHeader()->setFixedHeight(g_iFixedHeight);//标题栏高度
//ui->tableWidget->setColumnCount(1); //动态设置列数
//ui->tableWidget->horizontalHeader()->setStretchLastSection(true);//最后一列铺满最后
//标题
// QTableWidgetItem *headerItem = new QTableWidgetItem("");
// ui->tableWidget->setHorizontalHeaderItem(0, headerItem);
//我们让一列也可以滑动
ui->tableWidget->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
ui->tableWidget->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
// 设置右键菜单策略
ui->tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);
// 在窗口构造函数中
//ui->tableWidget->installEventFilter(this);
// 设置整个表格的委托,或者特定列的委托
//ui->tableWidget->setItemDelegate(new BackgroundDelegate(ui->tableWidget));
// 连接信号和槽
connect(ui->tableWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotContextMenu(QPoint)));
//connect(ui->tableWidget, SIGNAL(itemClicked(QTableWidgetItem*)), this, SLOT(slotItemClicked(QTableWidgetItem*)));
}
FormHead::~FormHead()
{
delete ui;
}
void FormHead::resizeWindow()
{
QRect rect = this->rect();
int tempWidth = m_iCols*g_iColsWidth+g_iFixedWidth+10;
int tempHight = m_iRows*g_iRowsHight+g_iFixedHeight+10;
//调整大小
if(rect.width()>tempWidth)
{
ui->tableWidget->setGeometry((rect.width()-tempWidth)/2, 2, tempWidth, tempHight);
}
else
{
ui->tableWidget->setGeometry(0, 2, tempWidth, tempHight);
}
}
void FormHead::resizeEvent(QResizeEvent *event)
{
resizeWindow();
}
void FormHead::Init(int iRows, int iCols)
{
m_iRows =iRows;
m_iCols = iCols;
//清空
ui->tableWidget->clearContents();
//ui->tableWidget->verticalHeader()->hide();//隐藏左侧系统序号栏
//ui->tableWidget->horizontalHeader()->hide();//隐藏上方系统序号栏
//ui->tableWidget->verticalHeader()->setFixedWidth(3);//标题栏宽度
//ui->tableWidget->horizontalHeader()->setFixedHeight(3);//标题栏高度
//QRect rect = this->rect();
//因为tableWidget需要提前规定好行数与列数
ui->tableWidget->setColumnCount(m_iCols);//列数
ui->tableWidget->setRowCount(m_iRows); //动态设置行数
// for(int i=0; i<m_iRows; i++)
// {
// //行标题
// QTableWidgetItem *headerItem = new QTableWidgetItem("");
// ui->tableWidget->setVerticalHeaderItem(i, headerItem);
// }
// for(int j=0; j<m_iCols; j++)
// {
// //列标题
// QTableWidgetItem *headerItem = new QTableWidgetItem("");
// ui->tableWidget->setHorizontalHeaderItem(j, headerItem);
// }
for(int i=0; i<m_iRows; i++)
{
//设置高度
ui->tableWidget->setRowHeight(i, g_iRowsHight);
for(int j=0; j<m_iCols; j++)
{
//设置列宽
ui->tableWidget->setColumnWidth(j, g_iColsWidth);
double colWidth = g_iColsWidth-1;
double rowHeight = g_iRowsHight-1;
QTableWidgetItem* item = new QTableWidgetItem("");//QString::number(i) + "-" + QString::number(j)
// 将图片路径存储在Qt::UserRole+1角色中
item->setData(Qt::UserRole+1, "./image/胜利符号库/解释结论符号/"); // 图片路径
item->setData(Qt::UserRole+2, colWidth/g_dPixelPerCm); //图例宽
item->setData(Qt::UserRole+3, rowHeight/g_dPixelPerCm); //图例高
ui->tableWidget->setItem(i, j, item);
//---------------------------
QString imagePath = ""; //"./image/胜利符号库/解释结论符号/油层.svg"
QVariant bgData = item->data(Qt::UserRole+1); // 我们约定用这个角色存储图片路径
if (bgData.isValid()) {
imagePath = bgData.toString();
}
if(imagePath=="")
{
continue;
}
//
if(imagePath.size()>4)
{
//
QString strLast = imagePath.right(4);
if(strLast.toLower()==".svg")
{
QSvgRenderer* svgRender = new QSvgRenderer();
svgRender->load(imagePath);
//
QPixmap* pixmap = new QPixmap(colWidth, rowHeight);
pixmap->fill(Qt::transparent);//设置背景透明
QPainter p(pixmap);
svgRender->render(&p);
//1.直接采用控件显示
QLabel* label = new QLabel;
label->setPixmap(*pixmap);
label->setAlignment(Qt::AlignHCenter);
label->show();
ui->tableWidget->setCellWidget(i, j,label);
}
else if(strLast.toLower()==".png")
{
}
}
}
}
//初始化完成后再连接信号槽,防止数据初始化时激活信号
connect(ui->tableWidget, SIGNAL(itemChanged(QTableWidgetItem*)), this, SLOT(onItemChanged(QTableWidgetItem*)));
connect(ui->tableWidget, SIGNAL(itemSelectionChanged()), this, SLOT(onItemSelectionChanged()));
}
void FormHead::slotItemClicked(QTableWidgetItem* item)
{
if (item) {
// 获取行和列索引
int row = item->row();
int column = item->column();
if(row>=0 && column>=0)
{
PropertyService()->initHeadProperty(this, ui->tableWidget, item, row, column);
}
}
}
void FormHead::onItemSelectionChanged()
{
QTableWidgetItem* item = ui->tableWidget->currentItem();
if (item) {
// 获取行和列索引
int row = item->row();
int column = item->column();
if(row>=0 && column>=0)
{
PropertyService()->initHeadProperty(this, ui->tableWidget, item, row, column);
}
}
}
void FormHead::onItemChanged(QTableWidgetItem* item)
{
if(m_bRefresh==false)
{
//针对属性页修改了内容,避免重复刷新属性页
m_bRefresh=true;
return;
}
if (item) {
// 获取行和列索引
int row = item->row();
int column = item->column();
if(row>=0 && column>=0)
{
PropertyService()->initHeadProperty(this, ui->tableWidget, item, row, column);
}
}
}
void FormHead::slotContextMenu(QPoint pos)
{
QMenu menu(ui->tableWidget);
QAction *mergeAction = menu.addAction("合并表格");
QAction *refreshAction = menu.addAction("拆分表格");
QAction *deleteAction = menu.addAction("删除行");
QAction *addAction = menu.addAction("添加行");
// 弹出菜单
QAction *selectedAction = menu.exec(ui->tableWidget->mapToGlobal(pos));
if (selectedAction == mergeAction) {
qDebug() << "合并表格";
slotMerge();
} else if (selectedAction == deleteAction) {
//删除1行
int row = ui->tableWidget->currentRow();
ui->tableWidget->removeRow(row);
} else if (selectedAction == refreshAction) {
qDebug() << "拆分表格";
slotSplit();
}
}
//合并
void FormHead::slotMerge()
{
QModelIndexList list = ui->tableWidget->selectionModel()->selectedIndexes();
if (list.size() < 2)
{
QMessageBox::warning(this, "单元格合并", "所选中单元格中为单个单元格,无法合并", "确定");
return;
}
int topRow = 0;
int leftCol = 0;
int bottomRow = 0;
int rightCol = 0;
QList<QTableWidgetSelectionRange> selectRanges = ui->tableWidget->selectedRanges();
if (selectRanges.size() > 0)
{
topRow = selectRanges[0].topRow();
leftCol = selectRanges[0].leftColumn();
bottomRow = selectRanges[0].bottomRow();
rightCol = selectRanges[0].rightColumn();
}
for(auto range:selectRanges)
{
if(range.topRow()<topRow)
topRow=range.topRow();
if(range.leftColumn()<leftCol)
leftCol=range.leftColumn();
if(range.bottomRow()> bottomRow)
bottomRow=range.bottomRow();
if(range.rightColumn()>rightCol)
rightCol=range.rightColumn();
}
int rowSpan = (bottomRow - topRow) + 1;
int colSpan = (rightCol - leftCol) + 1;
ui->tableWidget->setSpan(topRow, leftCol, rowSpan, colSpan);
}
//拆分
void FormHead::slotSplit()
{
int row,col;
QList<QTableWidgetSelectionRange> selectRanges = ui->tableWidget->selectedRanges();
if (selectRanges.size() < 2)
{
QMessageBox::warning(this, "拆分表格失败", "单元格已是最小单位,不能再进行拆分", "确定");
return;
}
QList<QTableWidgetItem*> selectItems = ui->tableWidget->selectedItems();
if(selectItems.size()==0)
{
QMessageBox::warning(this, "拆分表格失败", "请先为表格设置元素item", "确定");
return;
}
if(selectItems.size()>1)
{
QMessageBox::warning(this, "拆分表格失败", "非法选择", "确定");
return;
}
for(auto item:selectItems)
{
row= item->row();
col=item->column();
}
ui->tableWidget->setSpan(row, col, 1, 1); // 设置跨度为1
}
bool FormHead::eventFilter(QObject* obj, QEvent* event)
{
if (obj == ui->tableWidget && event->type() == QEvent::KeyPress) {
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
if (keyEvent->matches(QKeySequence::Paste)) {
onPasteExcelData();
return true;
}
}
return QWidget::eventFilter(obj, event);
}
//复制粘贴事件
void FormHead::keyPressEvent(QKeyEvent * event)
{
//excel 行分是 "\n" ; 列分是 "\t"
if (event->matches(QKeySequence::Copy))
{
copy();
}
else if (event->matches(QKeySequence::Paste))
{
Paste();
}
else if (event->matches(QKeySequence::SelectAll))
{
ui->tableWidget->selectAll();
}
else
{
QWidget::keyPressEvent(event);
}
}
void FormHead::copy()
{
QMap<int, QList<int>> selMap;//行,列
QList<QTableWidgetItem*> list = ui->tableWidget->selectedItems();
if (list.count() <= 0)
return;
for (QTableWidgetItem* item : list)
{
int rowN = ui->tableWidget->row(item);
int colN = ui->tableWidget->column(item);
selMap[rowN].append(colN);
}
QString cpStr;
QMap<int, QList<int>>::iterator it = selMap.begin();
while (it != selMap.end())
{
for (int i = 0; i < (*it).count(); i++)
{
QTableWidgetItem* item = ui->tableWidget->item(it.key(), (*it).at(i));
if (item)
{
cpStr.append(item->text().trimmed());
}
if (i != (*it).count() - 1)
cpStr.append("\t");
}
it++;
if (it != selMap.end())
{
cpStr.append("\n");
}
}
QApplication::clipboard()->setText(cpStr);
}
void FormHead::Paste()
{
QString pastText = QApplication::clipboard()->text();
QStringList rowList = pastText.split("\n", QString::KeepEmptyParts);
if(rowList.size()==0)
{
return;
}
if(rowList.at(rowList.size()-1)=="")
{
rowList.removeAt(rowList.size()-1);
}
QTableWidgetItem* crtItem = ui->tableWidget->currentItem();
int rowN, colN;
if (!crtItem)
{
rowN = ui->tableWidget->currentRow();
colN = ui->tableWidget->currentColumn();
}
else
{
rowN = ui->tableWidget->row(crtItem);
colN = ui->tableWidget->column(crtItem);
}
for (int i = 0; i < (ui->tableWidget->rowCount() - rowN) && (i < rowList.length()); i++)
{
QStringList rowDataList = rowList.at(i).split("\t", QString::KeepEmptyParts);
for (int j = 0; j < (ui->tableWidget->columnCount() - colN) && (j < rowDataList.length()); j++)
{
int x = i + rowN;
int y = j + colN;
QTableWidgetItem* item = ui->tableWidget->item(x, y);
if (item)
{
item->setText(rowDataList.at(j));
}
else
{
ui->tableWidget->setItem(x, y, new QTableWidgetItem(rowDataList.at(j)));
}
}
}
}
void FormHead::onPasteExcelData()
{
// QClipboard* clipboard = QApplication::clipboard();
// const QString clipData = clipboard->text();
// if (clipData.isEmpty()) return;
// QList<QStringList> rowsData;
// const QStringList rows = clipData.split('\n', QString::SkipEmptyParts);
// for (const QString row:rows) {
// rowsData << row.split('\t', QString::SkipEmptyParts);
// }
// QTableWidget* table = ui->tableWidget;
// const QModelIndex currentIndex = table->currentIndex();
// const int startRow = currentIndex.isValid() ? currentIndex.row() : 0;
// const int startCol = currentIndex.isValid() ? currentIndex.column() : 0;
// table->setUpdatesEnabled(false);
// table->setRowCount(std::max(table->rowCount(), startRow + rowsData.size()));
// table->setColumnCount(std::max(table->columnCount(), startCol + rowsData[0].size()));
// //更新行数,列数
// m_iRows = table->rowCount();
// m_iCols = table->columnCount();
// for (int i = 0; i < rowsData.size(); ++i) {
// for (int j = 0; j < rowsData[i].size(); ++j) {
// if (startRow + i >= table->rowCount()) break;
// if (startCol + j >= table->columnCount()) break;
// QTableWidgetItem* item = table->item(startRow + i, startCol + j);
// if (!item) {
// item = new QTableWidgetItem();
// table->setItem(startRow + i, startCol + j, item);
// }
// item->setText(rowsData[i][j]);
// }
// }
// table->setUpdatesEnabled(true);
// //改变大小
// resizeWindow();
}