logplus/logPlus/formhead.cpp
2026-06-22 11:08:16 +08:00

1289 lines
43 KiB
C++
Raw 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 "formhead.h"
#include "ui_formhead.h"
#include <QMessageBox>
#include <QDebug>
#include <QMenu>
#include <QClipboard>
#include "CallManage.h"
#include <QTimer>
#include <QSvgRenderer>
#include <QLabel>
#include <QDateTime>
#include "backgrounddelegate.h"
#include "PropertyWidget.h"
#include "geometryutils.h"
#include "qtprojectwidgets.h"
//extern int g_iRows;
//extern int g_iCols;
extern QString g_prjname;
//标题栏宽度、高度
int g_iFixedWidth=0;//40;
int g_iFixedHeight=0;//30;
int g_iColsWidth=100;
int g_iRowsHight=40;
extern double g_dPixelPerCm;//每厘米像素数
extern QtProjectWidgets *g_projectWidgets; //左侧工程区
//画图头
FormHead::FormHead(QWidget *parent, QString indexID) :
QWidget(parent),
ui(new Ui::FormHead)
{
ui->setupUi(this);
//加载样式
loadStyle(":/qrc/qss/flatgray.css");
m_indexID =indexID;
m_parent = (FormMultiHeads *)parent;
// 强制使用Qt渲染引擎
//QApplication::setAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles, true);
//取消全局样式表
// ui->tableWidget->setStyleSheet("");
// ui->tableWidget->setAutoFillBackground(true);
//设置样式表,不显示竖直边框
// 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->setSizeAdjustPolicy(QTableWidget::AdjustToContents); //表格大小随内容改变,会占满
//
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->installEventFilter(this);
// 设置整个表格的委托,或者特定列的委托
//ui->tableWidget->setItemDelegate(new BackgroundDelegate(ui->tableWidget));
// 设置右键菜单策略
ui->tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);
// 连接信号和槽
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::loadStyle(const QString &qssFile)
{
//加载样式表
QString qss;
QFile file(qssFile);
if (file.open(QFile::ReadOnly)) {
//用QTextStream读取样式文件不用区分文件编码 带bom也行
QStringList list;
QTextStream in(&file);
//in.setCodec("utf-8");
while (!in.atEnd()) {
QString line;
in >> line;
list << line;
}
file.close();
qss = list.join("\n");
QString paletteColor = qss.mid(20, 7);
this->setPalette(QPalette(paletteColor));
//用时主要在下面这句
this->setStyleSheet(qss);
}
}
void FormHead::resizeWindow(bool bDelete)
{
QRect rect = this->rect();
int tempWidth = 0; //m_iCols*(g_iColsWidth+1)+g_iFixedWidth;
int tempHight = 0; //m_iRows*(g_iRowsHight+1)+g_iFixedHeight;
for(int i=0; i<ui->tableWidget->columnCount(); i++)
{
tempWidth += ui->tableWidget->columnWidth(i);
tempWidth += 1;
}
//
for(int j=0; j<ui->tableWidget->rowCount(); j++)
{
tempHight += ui->tableWidget->rowHeight(j);
tempHight += 1;
}
//调整大小
if(rect.width()>tempWidth)
{
ui->tableWidget->setGeometry((rect.width()-tempWidth)/2, 2, tempWidth, tempHight);
}
else
{
ui->tableWidget->setGeometry(0, 2, tempWidth, tempHight);
}
m_parent->resizeItem(m_indexID, tempWidth, tempHight, bDelete);
}
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(0);//标题栏宽度
ui->tableWidget->horizontalHeader()->setFixedHeight(0);//标题栏高度
//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;
double rowHeight = g_iRowsHight;
QTableWidgetItem* item = new QTableWidgetItem("");//QString::number(i) + "-" + QString::number(j)
// 将图片路径存储在Qt::UserRole+1角色中
item->setData(Qt::UserRole+1, ""); //图片路径 ./image/胜利符号库/解释结论符号/
item->setData(Qt::UserRole+2, 0); //图例宽
item->setData(Qt::UserRole+3, 0); //图例高
// 设置背景色
QColor color(255, 255, 255, 255);
QBrush HeadBrush = QBrush(color);
HeadBrush.setStyle(Qt::SolidPattern);
item->setBackground(HeadBrush);
item->setData(Qt::BackgroundRole, color); // 双重保险
// 设置字体颜色
QColor colorTxt(0, 0, 0, 255);
item->setForeground(QBrush(colorTxt));
//item->setData(Qt::UserRole, QVariant("vertical"));
//
ui->tableWidget->setItem(i, j, item);
}
}
//初始化完成后再连接信号槽,防止数据初始化时激活信号
connect(ui->tableWidget, SIGNAL(itemChanged(QTableWidgetItem*)), this, SLOT(onItemChanged(QTableWidgetItem*)));
connect(ui->tableWidget, SIGNAL(itemSelectionChanged()), this, SLOT(onItemSelectionChanged()));//曲线选中,置顶
connect(CallManage::getInstance(), SIGNAL(sig_UnSelectTableItem(QString)), this, SLOT(s_UnSelectTableItem(QString)));
}
//更新
void FormHead::updateJsonInfo(QJsonObject headObjInfo, bool bMultiProject)
{
//展示其中一行
int iCols = 0;
int iRows = 0;
//
if (headObjInfo.contains("iCols"))
{
QJsonValue value = headObjInfo.value("iCols");
if (value.isDouble()) {
iCols = value.toInt();
//qDebug() << "iCols:" << QString::number(iCols);
}
}
//
if (headObjInfo.contains("iRows"))
{
QJsonValue value = headObjInfo.value("iRows");
if (value.isDouble()) {
iRows = value.toInt();
//qDebug() << "iRows:" << QString::number(iRows);
}
}
//
QJsonArray itemsArray;
if (headObjInfo.contains("items"))
{
QJsonValue value = headObjInfo.value("items");
if (value.isArray()) {
itemsArray = value.toArray();
//qDebug() << "tracksArray number:" << QString::number(itemsArray.size());
//展示所有单元格
DisplayItems(itemsArray, bMultiProject);
}
}
//大小改变
resizeWindow();
}
//展示所有单元格
void FormHead::DisplayItems(QJsonArray itemsArray, bool bMultiProject)
{
QMap<int, int> mapItems;
int id = 0;
int iCount = itemsArray.size();
for(int i=0; i<iCount; i++)
{
QJsonValue itemValue = itemsArray[i];
QJsonObject itemObj = itemValue.toObject();
//
if (itemObj.contains("id"))
{
QJsonValue value = itemObj.value("id");
if (value.isDouble()) {
id = value.toInt();
//qDebug() << "id:" << QString::number(id);
//
mapItems.insert(id, i);
}
}
}
for(int id=0; id<iCount; id++)
{
if(mapItems.contains(id))
{
int iNum = mapItems.value(id);
QJsonValue itemValue = itemsArray[iNum];
QJsonObject itemObj = itemValue.toObject();
int col=-1;
int row=-1;
//
if (itemObj.contains("col"))
{
QJsonValue value = itemObj.value("col");
if (value.isDouble()) {
col = value.toInt();
//qDebug() << "col:" << QString::number(col);
}
}
//
if (itemObj.contains("row"))
{
QJsonValue value = itemObj.value("row");
if (value.isDouble()) {
row = value.toInt();
//qDebug() << "row:" << QString::number(row);
}
}
if(col>-1 && row>-1)
{
QTableWidgetItem* item = ui->tableWidget->item(row, col);
//内容
if (itemObj.contains("text"))
{
//暂时没有公式,可以先显示文字内容
QJsonValue value = itemObj.value("text");
if (value.isString()) {
QString newText = value.toString();
//qDebug() << "text:" << newText;
item->setText(newText);
}
}
//字体
if (itemObj.contains("Font"))
{
QJsonValue value = itemObj.value("Font");
QFont newFont;
newFont.fromString(value.toString());
item->setFont(newFont);
}
//字体颜色
if (itemObj.contains("FontColor"))
{
QJsonValue value = itemObj.value("FontColor");
QColor newColor;
newColor.setNamedColor(value.toString());
// 设置字体颜色
QBrush brush(newColor);
item->setForeground(brush);
}
//背景颜色
if (itemObj.contains("backColor"))
{
QJsonValue value = itemObj.value("backColor");
QColor newColor;
newColor.setNamedColor(value.toString());
// 设置颜色
QBrush brush(newColor);
item->setBackground(brush);
}
//列宽(cm)
double colWidth = 0;
double rowHeight = 0;
if (itemObj.contains("colWidth"))
{
QJsonValue value = itemObj.value("colWidth");
if (value.isDouble()) {
colWidth = value.toDouble();
//qDebug() << "colWidth:" << QString::number(colWidth);
ui->tableWidget->setColumnWidth(col, colWidth*g_dPixelPerCm);
}
}
//行高
if (itemObj.contains("rowHeight"))
{
QJsonValue value = itemObj.value("rowHeight");
if (value.isDouble()) {
rowHeight = value.toDouble();
//qDebug() << "rowHeight:" << QString::number(rowHeight);
ui->tableWidget->setRowHeight(row, rowHeight*g_dPixelPerCm);
}
}
//图例
QString imagePath = "";
double colWidth_Img = 0;
double rowHeight_Img = 0;
if (itemObj.contains("imagePath"))
{
QJsonValue value = itemObj.value("imagePath");
if (value.isString()) {
imagePath = value.toString();
//qDebug() << "imagePath:" << imagePath;
item->setData(Qt::UserRole+1, imagePath); // 图片路径
}
}
//图例宽(cm)
if (itemObj.contains("colWidth_Img"))
{
QJsonValue value = itemObj.value("colWidth_Img");
if (value.isDouble()) {
colWidth_Img = value.toDouble();
//qDebug() << "colWidth_Img:" << QString::number(colWidth_Img);
item->setData(Qt::UserRole+2, colWidth_Img);
}
}
//图例高(cm)
if (itemObj.contains("rowHeight_Img"))
{
QJsonValue value = itemObj.value("rowHeight_Img");
if (value.isDouble()) {
rowHeight_Img = value.toDouble();
//qDebug() << "rowHeight_Img:" << QString::number(rowHeight_Img);
item->setData(Qt::UserRole+3, rowHeight_Img);
}
}
if(imagePath != "")
{
//图例
ChangHeadItemProperty(row, col, imagePath, colWidth_Img*g_dPixelPerCm, rowHeight_Img*g_dPixelPerCm);
}
//公式
QString strFormulaText = "";
if (itemObj.contains("FormulaText"))
{
QJsonValue value = itemObj.value("FormulaText");
if (value.isString()) {
strFormulaText = value.toString();
//qDebug() << "FormulaText:" << strFormulaText;
item->setData(Qt::UserRole+4, strFormulaText);
}
}
//slf名
QString strSlfName = "";
QString strWellName = "";
//多井的打开工程使用模板的井名和slf名
if(bMultiProject)
{
if (itemObj.contains("SlfName"))
{
QJsonValue value = itemObj.value("SlfName");
if (value.isString()) {
strSlfName = value.toString();
//qDebug() << "SlfName:" << strSlfName;
item->setData(Qt::UserRole+5, strSlfName);
}
}
//井次名
if (itemObj.contains("WellName"))
{
QJsonValue value = itemObj.value("WellName");
if (value.isString()) {
strWellName = value.toString();
//qDebug() << "WellName:" << strWellName;
item->setData(Qt::UserRole+6, strWellName);
}
}
}
else
{
QString strLeft = g_projectWidgets->getLeftTreeString_Import();
if(strLeft.length() > 0)
{
QStringList list = strLeft.split("#@@#");//QString字符串分割函数
if (list.size() > 3)
{
strSlfName = list[0];
strWellName = list[1];
}
}
}
//公式操作类型
int iFormulaType = 0;
if (itemObj.contains("FormulaType"))
{
QJsonValue value = itemObj.value("FormulaType");
if (value.isDouble()) {
iFormulaType = value.toInt();
//qDebug() << "FormulaType:" << strWellName;
item->setData(Qt::UserRole+7, iFormulaType);
}
}
if(strFormulaText!="")
{
PropertyService()->m_FormulaType = (PropertyWidget::FormualType)iFormulaType;
//先判断公式有效性
QString TableName,FieldName;
int DecNum,m_ValType=0;
QString RecNo;
bool isOk=false;
//float value;
PropertyService()->ParseFormualInfos(strFormulaText,TableName,FieldName,RecNo,DecNum,isOk);
if (!isOk)
{
return;
}
//使用公式,组织数据
//qDebug() << "公式操作类型->改变 " << newFormulaText <<" "<<strSlfName <<" "<<strWellName;
QString computeCellResult = "";
if(!strSlfName.isEmpty() &&
!strFormulaText.isEmpty() &&
strFormulaText.indexOf("=TABLE")>-1)
{
CMemRdWt mem;
if(mem.Open(strSlfName.toStdString().c_str(), CLogIO::modeRead)) {
computeCellResult = PropertyService()->ComputeCell(mem, strFormulaText);
mem.Close();
}
}
//文字显示
item->setText(computeCellResult);
}
//合并单元格
int rowSpan = 1;
int colSpan = 1;
if (itemObj.contains("rowSpan"))
{
QJsonValue value = itemObj.value("rowSpan");
if (value.isDouble()) {
rowSpan = value.toInt();
//qDebug() << "rowSpan:" << QString::number(rowSpan);
}
}
if (itemObj.contains("columnSpan"))
{
QJsonValue value = itemObj.value("columnSpan");
if (value.isDouble()) {
colSpan = value.toInt();
//qDebug() << "colSpan:" << QString::number(colSpan);
}
}
if(rowSpan > 1 || colSpan > 1)
{
int rowSpanCurrent = 0;
int columnSpanCurrent = 0;
rowSpanCurrent = ui->tableWidget->rowSpan(row, col);
columnSpanCurrent = ui->tableWidget->columnSpan(row, col);
if(rowSpanCurrent > 1 || columnSpanCurrent > 1)
{
//已经合并过,不再合并
}
else {
//合并单元格
ui->tableWidget->setSpan(row, col, rowSpan, colSpan);
}
}
}
}
}
}
void FormHead::ChangHeadItemProperty(int iRow, int iCol, QString imagePath, int colWidth, int rowHeight)
{
//清空
ui->tableWidget->setCellWidget(iRow, iCol, nullptr);
if(imagePath!="")
{
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-1, rowHeight-1);
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(iRow, iCol, label);
//m_item->setIcon(QIcon(*pixmap));
// 设置背景刷
//QBrush brush(*pixmap);
//m_item->setBackground(brush);
//m_tableWidget->setItem(m_iRow, m_iCol, new QTableWidgetItem(QIcon(*pixmap),tr("")));
}
else if(strLast.toLower()==".png")
{
// 加载图片
QPixmap pixmap(imagePath);
//pixmap.scaled(colWidth-1, rowHeight-1, Qt::KeepAspectRatio, Qt::SmoothTransformation);//缩放
//1.直接采用控件显示
QLabel* label = new QLabel;
label->setPixmap(pixmap.scaled(colWidth-1, rowHeight-1, Qt::KeepAspectRatio, Qt::SmoothTransformation));//图片保持比例缩放
label->setAlignment(Qt::AlignHCenter);
label->show();
//
ui->tableWidget->setCellWidget(iRow, iCol, label);
}
}
}
}
QJsonObject FormHead::makeJson()
{
int columnCount = ui->tableWidget->columnCount();//总列数
int rowCount = ui->tableWidget->rowCount();//总行数
// 创建根对象
QJsonObject rootObj;
//
rootObj["indexID"] = m_indexID;
rootObj["iRows"] = rowCount;
rootObj["iCols"] = columnCount;
//
int id=0;
QJsonArray subcaseArray;
for(int col=0; col<columnCount; col++)
{
for(int row=0; row<rowCount; row++)
{
QTableWidgetItem* item = ui->tableWidget->item(row, col);
QJsonObject formHeadObj;
formHeadObj["id"] = id;
formHeadObj["row"] = row;
formHeadObj["col"] = col;
id++;
if(item)
{
//图例
QString imagePath = "";
//图头, 图例宽高
double my_colWidth_Img = 1;
double my_rowHeight_Img = 1;
//图头, 行高、列宽
double my_colWidth = 1;
double my_rowHeight = 1;
QVariant bgData = item->data(Qt::UserRole+1); // 我们约定用这个角色存储图片路径
if (bgData.isValid()) {
imagePath = bgData.toString();
}
//图例宽
QVariant colWidth_Img = item->data(Qt::UserRole+2);
if (colWidth_Img.isValid()) {
my_colWidth_Img = colWidth_Img.toDouble();
}
//图例高
QVariant rowHeight_Img = item->data(Qt::UserRole+3);
if (rowHeight_Img.isValid()) {
my_rowHeight_Img = rowHeight_Img.toDouble();
}
//公式
QString strFormulaText = "";
QVariant vtFormula = item->data(Qt::UserRole+4);
if (vtFormula.isValid()) {
strFormulaText = vtFormula.toString();
}
else
{
strFormulaText = "";
}
//slf名
QString strSlfName = "";
QVariant vtSlfName = item->data(Qt::UserRole+5);
if (vtSlfName.isValid()) {
strSlfName = vtSlfName.toString();
}
else
{
strSlfName = "";
}
//井次名
QString strWellName = "";
QVariant vtWellName = item->data(Qt::UserRole+6);
if (vtWellName.isValid()) {
strWellName = vtWellName.toString();
}
else
{
strWellName = "";
}
//公式操作类型
int iFormulaType = 0;
QVariant vtFormula_type = item->data(Qt::UserRole+7);
if (vtFormula_type.isValid()) {
iFormulaType = vtFormula_type.toInt();
}
else
{
iFormulaType = 0;
}
//行高、列宽
my_colWidth = ui->tableWidget->columnWidth(col)/g_dPixelPerCm;
my_rowHeight = ui->tableWidget->rowHeight(row)/g_dPixelPerCm;
int rowSpan = 0;
int columnSpan = 0;
rowSpan = ui->tableWidget->rowSpan(row, col);
columnSpan = ui->tableWidget->columnSpan(row, col);
//----------------
formHeadObj["imagePath"] = imagePath;
formHeadObj["colWidth_Img"] = my_colWidth_Img;
formHeadObj["rowHeight_Img"] = my_rowHeight_Img;
formHeadObj["backColor"] = item->background().color().name();//背景颜色
if(strFormulaText != "")
{
//使用公式计算文本
formHeadObj["text"] = "";
}
else{
formHeadObj["text"] = item->text();
}
formHeadObj["Font"] = item->font().toString();
formHeadObj["FontColor"] = item->foreground().color().name();
formHeadObj["colWidth"] = my_colWidth;
formHeadObj["rowHeight"] = my_rowHeight;
formHeadObj["rowSpan"] = rowSpan;
formHeadObj["columnSpan"] = columnSpan;
formHeadObj["FormulaText"] = strFormulaText;
formHeadObj["SlfName"] = strSlfName;
formHeadObj["WellName"] = strWellName;
formHeadObj["FormulaType"] = iFormulaType;
}
subcaseArray.append(formHeadObj);
}
}
rootObj["items"]=subcaseArray;
return rootObj;
}
//图头、成果表
//取消其他表格的选中状态
void FormHead::s_UnSelectTableItem(QString strUuid)
{
if(strUuid==m_indexID)
{
return;
}
//取消表格的选中状态
ui->tableWidget->clearSelection();
}
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);
//取消其他表格的选中状态
emit CallManage::getInstance()->sig_UnSelectTableItem(m_indexID);
}
}
}
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);
//取消其他表格的选中状态
emit CallManage::getInstance()->sig_UnSelectTableItem(m_indexID);
}
}
}
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);
//取消其他表格的选中状态
emit CallManage::getInstance()->sig_UnSelectTableItem(m_indexID);
}
}
}
void FormHead::slotContextMenu(QPoint pos)
{
QMenu menu(ui->tableWidget);
menu.addAction(QIcon(::GetImagePath() + "icon/MergeCell.png"), "合并单元格", this, &FormHead::slotMerge);
menu.addAction(QIcon(::GetImagePath() + "icon/Grid.png"), "拆分单元格", this, &FormHead::slotSplit);
menu.addSeparator();
menu.addAction(QIcon(::GetImagePath() + "icon/AddRow.png"), "前插入行", this, &FormHead::slotAddRow);
menu.addAction(QIcon(::GetImagePath() + "icon/AddRow.png"), "后插入行", this, &FormHead::slotAddAfterRow);
menu.addSeparator();
menu.addAction(QIcon(::GetImagePath() + "icon/AddColumn.png"), "前插入列", this, &FormHead::slotAddCol);
menu.addAction(QIcon(::GetImagePath() + "icon/AddColumn.png"), "后插入列", this, &FormHead::slotAddAfterCol);
menu.addSeparator();
menu.addAction(QIcon(::GetImagePath() + "icon/DelRow.png"), "删除行", this, &FormHead::slotDeleteRow);
menu.addAction(QIcon(::GetImagePath() + "icon/DelColumn.png"), "删除列", this, &FormHead::slotDeleteCol);
menu.addAction(QIcon(::GetImagePath() + "icon/DeleteTable.png"), "删除表", this, &FormHead::slotDeleteTable);
menu.exec(ui->tableWidget->mapToGlobal(pos));
}
//合并
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
}
//前插入行
void FormHead::slotAddRow()
{
int row = ui->tableWidget->currentRow();
ui->tableWidget->insertRow(row);
//新插入行,单元格初始化
int iCols = ui->tableWidget->columnCount();
for(int j=0; j<iCols; j++)
{
QTableWidgetItem* item = new QTableWidgetItem("");
// 将图片路径存储在Qt::UserRole+1角色中
item->setData(Qt::UserRole+1, ""); //图片路径 ./image/胜利符号库/解释结论符号/
item->setData(Qt::UserRole+2, 0); //图例宽
item->setData(Qt::UserRole+3, 0); //图例高
// 设置背景色
QColor color(255, 255, 255, 255);
QBrush HeadBrush = QBrush(color);
HeadBrush.setStyle(Qt::SolidPattern);
item->setBackground(HeadBrush);
item->setData(Qt::BackgroundRole, color); // 双重保险
// 设置字体颜色
QColor colorTxt(0, 0, 0, 255);
item->setForeground(QBrush(colorTxt));
//item->setData(Qt::UserRole, QVariant("vertical"));
//
ui->tableWidget->setItem(row, j, item);
}
//改变大小
resizeWindow();
}
//后插入行
void FormHead::slotAddAfterRow()
{
int row = ui->tableWidget->currentRow();
ui->tableWidget->insertRow(row+1);
//新插入行,单元格初始化
int iCols = ui->tableWidget->columnCount();
for(int j=0; j<iCols; j++)
{
QTableWidgetItem* item = new QTableWidgetItem("");
// 将图片路径存储在Qt::UserRole+1角色中
item->setData(Qt::UserRole+1, ""); //图片路径 ./image/胜利符号库/解释结论符号/
item->setData(Qt::UserRole+2, 0); //图例宽
item->setData(Qt::UserRole+3, 0); //图例高
// 设置背景色
QColor color(255, 255, 255, 255);
QBrush HeadBrush = QBrush(color);
HeadBrush.setStyle(Qt::SolidPattern);
item->setBackground(HeadBrush);
item->setData(Qt::BackgroundRole, color); // 双重保险
// 设置字体颜色
QColor colorTxt(0, 0, 0, 255);
item->setForeground(QBrush(colorTxt));
//item->setData(Qt::UserRole, QVariant("vertical"));
//
ui->tableWidget->setItem(row+1, j, item);
}
//改变大小
resizeWindow();
}
//前插入列
void FormHead::slotAddCol()
{
int col = ui->tableWidget->currentColumn();
ui->tableWidget->insertColumn(col);
//新插入行,单元格初始化
int iRows = ui->tableWidget->rowCount();
for(int j=0; j<iRows; j++)
{
QTableWidgetItem* item = new QTableWidgetItem("");
// 将图片路径存储在Qt::UserRole+1角色中
item->setData(Qt::UserRole+1, ""); //图片路径 ./image/胜利符号库/解释结论符号/
item->setData(Qt::UserRole+2, 0); //图例宽
item->setData(Qt::UserRole+3, 0); //图例高
// 设置背景色
QColor color(255, 255, 255, 255);
QBrush HeadBrush = QBrush(color);
HeadBrush.setStyle(Qt::SolidPattern);
item->setBackground(HeadBrush);
item->setData(Qt::BackgroundRole, color); // 双重保险
// 设置字体颜色
QColor colorTxt(0, 0, 0, 255);
item->setForeground(QBrush(colorTxt));
//item->setData(Qt::UserRole, QVariant("vertical"));
//
ui->tableWidget->setItem(j, col, item);
}
//改变大小
resizeWindow();
}
//后插入列
void FormHead::slotAddAfterCol()
{
int col = ui->tableWidget->currentColumn();
ui->tableWidget->insertColumn(col+1);
//新插入行,单元格初始化
int iRows = ui->tableWidget->rowCount();
for(int j=0; j<iRows; j++)
{
QTableWidgetItem* item = new QTableWidgetItem("");
// 将图片路径存储在Qt::UserRole+1角色中
item->setData(Qt::UserRole+1, ""); //图片路径 ./image/胜利符号库/解释结论符号/
item->setData(Qt::UserRole+2, 0); //图例宽
item->setData(Qt::UserRole+3, 0); //图例高
// 设置背景色
QColor color(255, 255, 255, 255);
QBrush HeadBrush = QBrush(color);
HeadBrush.setStyle(Qt::SolidPattern);
item->setBackground(HeadBrush);
item->setData(Qt::BackgroundRole, color); // 双重保险
// 设置字体颜色
QColor colorTxt(0, 0, 0, 255);
item->setForeground(QBrush(colorTxt));
//item->setData(Qt::UserRole, QVariant("vertical"));
//
ui->tableWidget->setItem(j, col+1, item);
}
//改变大小
resizeWindow();
}
//删除行
void FormHead::slotDeleteRow()
{
//删除1行
int row = ui->tableWidget->currentRow();
ui->tableWidget->removeRow(row);
int rowCount = ui->tableWidget->rowCount();
if(rowCount==0)
{
//改变大小,并删除父窗口的对应行
resizeWindow(true);
}
else {
//改变大小
resizeWindow(false);
}
}
//删除列
void FormHead::slotDeleteCol()
{
//删除1列
int col = ui->tableWidget->currentColumn();
ui->tableWidget->removeColumn(col);
int colCount = ui->tableWidget->columnCount();
if(colCount==0)
{
//改变大小,并删除父窗口的对应行
resizeWindow(true);
}
else {
//改变大小
resizeWindow(false);
}
}
//删除表
void FormHead::slotDeleteTable()
{
//删除
ui->tableWidget->clear();
//改变大小,并删除父窗口的对应行
resizeWindow(true);
}
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()
{
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);
}
bool bImg=false;
QPixmap pixmap = QApplication::clipboard()->pixmap();
if(pixmap.isNull())
{
}
else
{
bImg=true;
//1.直接采用控件显示
QLabel* label = new QLabel;
label->setPixmap(pixmap);
label->setAlignment(Qt::AlignHCenter);
label->show();
ui->tableWidget->setCellWidget(rowN, colN, label);
// 保存为PNG文件
QString strImg = QDateTime::currentDateTime().toString("yyyyMMdd-hhmmsszzz");
//Logdata
QString folderPath;
folderPath = GetLogdataPath();
folderPath = folderPath + g_prjname;
folderPath = folderPath + "/" + strImg + ".png";
pixmap.save(folderPath, "PNG");
//
QTableWidgetItem* item = ui->tableWidget->item(rowN, colN);
// 将图片路径存储在Qt::UserRole+1角色中
item->setData(Qt::UserRole+1, folderPath); // 图片路径
item->setData(Qt::UserRole+2, pixmap.width()/g_dPixelPerCm); //图例宽
item->setData(Qt::UserRole+3, pixmap.height()/g_dPixelPerCm); //图例高
PropertyService()->initHeadProperty(this, ui->tableWidget, item, rowN, colN);
//取消其他表格的选中状态
emit CallManage::getInstance()->sig_UnSelectTableItem(m_indexID);
return;
}
QString pastText = QApplication::clipboard()->text();
QStringList rowList = pastText.split("\n", QString::KeepEmptyParts);
if(rowList.size()==0)
{
if(pixmap.isNull())
{
return;
}
else
{
bImg=true;
}
}
if(rowList.at(rowList.size()-1)=="")
{
rowList.removeAt(rowList.size()-1);
}
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();
}