#include "formhead.h" #include "ui_formhead.h" #include #include #include #include #include "CallManage.h" #include #include #include #include #include "backgrounddelegate.h" #include "PropertyWidget.h" #include "geometryutils.h" #include "qtprojectwidgets.h" #include "CellBorderDlg.h" //extern int g_iRows; //extern int g_iCols; extern QString g_prjname; //标题栏宽度、高度 int g_iFixedWidth=0;//40; int g_iFixedHeight=0;//30; extern double g_dPixelPerCm;//每厘米像素数 //下方赋值 int g_iColsWidth=0; //100 int g_iRowsHight=0; //40 extern QtProjectWidgets *g_projectWidgets; //左侧工程区 //画图头 FormHead::FormHead(QWidget *parent, QString indexID) : QWidget(parent), ui(new Ui::FormHead) { ui->setupUi(this); g_iColsWidth = g_dPixelPerCm * HEAD_COL_Width; g_iRowsHight = g_dPixelPerCm * HEAD_ROW_Height; //加载样式 loadStyle(":/qrc/qss/flatgray.css"); m_indexID =indexID; m_parent = (FormMultiHeads *)parent; m_strHeadOrTail = m_parent->m_strHeadOrTail; // 强制使用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->setShowGrid(false); // 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; itableWidget->columnCount(); i++) { tempWidth += ui->tableWidget->columnWidth(i); tempWidth += 1; } // for(int j=0; jtableWidget->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; itableWidget->setVerticalHeaderItem(i, headerItem); // } // for(int j=0; jtableWidget->setHorizontalHeaderItem(j, headerItem); // } for(int i=0; itableWidget->setRowHeight(i, g_iRowsHight); for(int j=0; jtableWidget->setColumnWidth(j, g_iColsWidth); double colWidth = g_iColsWidth; double rowHeight = g_iRowsHight; FormTableItem* formTableItem = new FormTableItem; ui->tableWidget->setCellWidget(i, j, formTableItem); } } //初始化完成后再连接信号槽,防止数据初始化时激活信号 connect(CallManage::getInstance(), SIGNAL(sig_UnSelectTableItem(QString)), this, SLOT(s_UnSelectTableItem(QString))); connect(ui->tableWidget, SIGNAL(cellChanged(int, int)), this, SLOT(slotCellChanged(int, int))); connect(ui->tableWidget, SIGNAL(currentCellChanged(int, int, int, int)), this, SLOT(slotCurrentCellChanged(int, int, int, int))); //鼠标点击表格 connect(ui->tableWidget, SIGNAL(cellClicked(int, int)), this, SLOT(slotCellClicked(int, int))); } void FormHead::slotCellClicked(int row, int column) { //取消其他表格的选中状态(图头、成果表) emit CallManage::getInstance()->sig_UnSelectTableItem(m_indexID); } //更新 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 mapItems; int id = 0; int iCount = itemsArray.size(); for(int i=0; i-1 && row>-1) { FormTableItem* formTableItemTmp = nullptr; auto myWidget = ui->tableWidget->cellWidget(row, col); if(myWidget) { formTableItemTmp = (FormTableItem*)myWidget;//获得widget if(!formTableItemTmp) { continue; } } else{ continue; } //内容 if (itemObj.contains("text")) { //暂时没有公式,可以先显示文字内容 QJsonValue value = itemObj.value("text"); if (value.isString()) { QString newText = value.toString(); formTableItemTmp->m_strShowTxt = newText; //qDebug() << "text:" << newText; } } //字体 if (itemObj.contains("Font")) { QJsonValue value = itemObj.value("Font"); QFont newFont; newFont.fromString(value.toString()); formTableItemTmp->m_txtFont = newFont; } //字体颜色 if (itemObj.contains("FontColor")) { QJsonValue value = itemObj.value("FontColor"); QColor newColor; newColor.setNamedColor(value.toString()); // 设置字体颜色 formTableItemTmp->m_txtColor = newColor; } //背景颜色 if (itemObj.contains("backColor")) { QJsonValue value = itemObj.value("backColor"); QColor newColor; newColor.setNamedColor(value.toString()); // 设置颜色 formTableItemTmp->m_backColor = newColor; } //列宽(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); formTableItemTmp->m_colWidth = 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); formTableItemTmp->m_rowHeight = 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; formTableItemTmp->m_strImg = 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); formTableItemTmp->m_colWidth_Img = 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); formTableItemTmp->m_rowHeight_Img = 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; formTableItemTmp->m_strFormulaText = 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; formTableItemTmp->m_strSlfName = strSlfName; } } //井次名 if (itemObj.contains("WellName")) { QJsonValue value = itemObj.value("WellName"); if (value.isString()) { strWellName = value.toString(); //qDebug() << "WellName:" << strWellName; formTableItemTmp->m_strWellName = 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]; // formTableItemTmp->m_strSlfName = strSlfName; formTableItemTmp->m_strWellName = strWellName; } } } //公式操作类型 int iFormulaType = 0; if (itemObj.contains("FormulaType")) { QJsonValue value = itemObj.value("FormulaType"); if (value.isDouble()) { iFormulaType = value.toInt(); //qDebug() << "FormulaType:" << strWellName; formTableItemTmp->m_iFormulaType = iFormulaType; } } // 垂向绘制 if (itemObj.contains("VerticaDrawing")) { formTableItemTmp->m_bVerticaDrawing = itemObj["VerticaDrawing"].toBool(); } 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 <<" "<-1) { CMemRdWt mem; if(mem.Open(strSlfName.toStdString().c_str(), CLogIO::modeRead)) { computeCellResult = PropertyService()->ComputeCell(mem, strFormulaText); mem.Close(); } } //文字显示 formTableItemTmp->m_strShowTxt = computeCellResult; } //边框 if (itemObj.contains("drawBorder")) { formTableItemTmp->m_drawBorder = (FormTableItem::MetaBorder)itemObj["drawBorder"].toInt(); } //线宽 if (itemObj.contains("TopBorderWidth")) { formTableItemTmp->TopBorderWidth = itemObj["TopBorderWidth"].toInt(); } if (itemObj.contains("RightBorderWidth")) { formTableItemTmp->RightBorderWidth = itemObj["RightBorderWidth"].toInt(); } if (itemObj.contains("BottomBorderWidth")) { formTableItemTmp->BottomBorderWidth = itemObj["BottomBorderWidth"].toInt(); } if (itemObj.contains("LeftBorderWidth")) { formTableItemTmp->LeftBorderWidth = itemObj["LeftBorderWidth"].toInt(); } //线形 if (itemObj.contains("TopBorderStyle")) { formTableItemTmp->TopBorderStyle = itemObj["TopBorderStyle"].toInt(); } if (itemObj.contains("RightBorderStyle")) { formTableItemTmp->RightBorderStyle = itemObj["RightBorderStyle"].toInt(); } if (itemObj.contains("BottomBorderStyle")) { formTableItemTmp->BottomBorderStyle = itemObj["BottomBorderStyle"].toInt(); } if (itemObj.contains("LeftBorderStyle")) { formTableItemTmp->LeftBorderStyle = itemObj["LeftBorderStyle"].toInt(); } //是否显示 if (itemObj.contains("TopState")) { formTableItemTmp->m_TopState = itemObj["TopState"].toBool(); } if (itemObj.contains("RightState")) { formTableItemTmp->m_RightState = itemObj["RightState"].toBool(); } if (itemObj.contains("BottomState")) { formTableItemTmp->m_BottomState = itemObj["BottomState"].toBool(); } if (itemObj.contains("LeftState")) { formTableItemTmp->m_LeftState = itemObj["LeftState"].toBool(); } //刷新,重新调整字体高度等 formTableItemTmp->update(); //合并单元格 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) { if(imagePath!="") { if(imagePath.size()>4) { FormTableItem* formTableItemTmp = nullptr; auto myWidget = ui->tableWidget->cellWidget(iRow, iCol); if(myWidget) { formTableItemTmp = (FormTableItem*)myWidget;//获得widget if(!formTableItemTmp) { return; } } else{ return; } // 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); formTableItemTmp->m_pixmap = *pixmap; formTableItemTmp->update(); } else if(strLast.toLower()==".png") { // 加载图片 QPixmap pixmap(imagePath); formTableItemTmp->m_pixmap = pixmap.scaled(colWidth-1, rowHeight-1, Qt::KeepAspectRatio, Qt::SmoothTransformation);//缩放 formTableItemTmp->update(); } } } } 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; coltableWidget->cellWidget(row, col); if(myWidget) { formTableItemTmp = (FormTableItem*)myWidget;//获得widget if(!formTableItemTmp) { continue; } } else{ continue; } QJsonObject formHeadObj; formHeadObj["id"] = id; formHeadObj["row"] = row; formHeadObj["col"] = col; id++; { //图例 QString imagePath = ""; //图头, 图例宽高 double my_colWidth_Img = 1; double my_rowHeight_Img = 1; //图头, 行高、列宽 double my_colWidth = 1; double my_rowHeight = 1; imagePath = formTableItemTmp->m_strImg; my_colWidth_Img = formTableItemTmp->m_colWidth_Img; my_rowHeight_Img = formTableItemTmp->m_rowHeight_Img; //公式 QString strFormulaText = ""; strFormulaText = formTableItemTmp->m_strFormulaText; //slf名 QString strSlfName = ""; strSlfName = formTableItemTmp->m_strSlfName; //井次名 QString strWellName = ""; strWellName = formTableItemTmp->m_strWellName; //公式操作类型 int iFormulaType = 0; iFormulaType = formTableItemTmp->m_iFormulaType; //行高、列宽 my_colWidth = formTableItemTmp->m_colWidth; //ui->tableWidget->columnWidth(col)/g_dPixelPerCm; my_rowHeight = formTableItemTmp->m_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"] = formTableItemTmp->m_backColor.name();//背景颜色 if(strFormulaText != "") { //使用公式计算文本 formHeadObj["text"] = ""; } else{ formHeadObj["text"] = formTableItemTmp->m_strShowTxt; } formHeadObj["Font"] = formTableItemTmp->m_txtFont.toString(); formHeadObj["FontColor"] = formTableItemTmp->m_txtColor.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; formHeadObj["VerticaDrawing"] = formTableItemTmp->m_bVerticaDrawing; // formHeadObj["drawBorder"] = (int)formTableItemTmp->m_drawBorder; formHeadObj["TopBorderWidth"] = formTableItemTmp->TopBorderWidth; formHeadObj["RightBorderWidth"] = formTableItemTmp->RightBorderWidth; formHeadObj["BottomBorderWidth"] = formTableItemTmp->BottomBorderWidth; formHeadObj["LeftBorderWidth"] = formTableItemTmp->LeftBorderWidth; // formHeadObj["TopBorderStyle"] = formTableItemTmp->TopBorderStyle; formHeadObj["RightBorderStyle"] = formTableItemTmp->RightBorderStyle; formHeadObj["BottomBorderStyle"] = formTableItemTmp->BottomBorderStyle; formHeadObj["LeftBorderStyle"] = formTableItemTmp->LeftBorderStyle; // formHeadObj["TopState"] = formTableItemTmp->m_TopState; formHeadObj["RightState"] = formTableItemTmp->m_RightState; formHeadObj["BottomState"] = formTableItemTmp->m_BottomState; formHeadObj["LeftState"] = formTableItemTmp->m_LeftState; } subcaseArray.append(formHeadObj); } } rootObj["items"]=subcaseArray; return rootObj; } //图头、成果表 //取消其他表格的选中状态 void FormHead::s_UnSelectTableItem(QString strUuid) { if(strUuid==m_indexID) { return; } //取消表格的选中状态 ui->tableWidget->clearSelection(); } void FormHead::slotCurrentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn) { if(currentRow>=0 && currentColumn>=0) { auto myWidget = ui->tableWidget->cellWidget(currentRow, currentColumn); if(myWidget) { FormTableItem* formTableItemTmp = (FormTableItem*)myWidget;//获得widget if(formTableItemTmp) { PropertyService()->initHeadProperty(this, ui->tableWidget, formTableItemTmp, currentRow, currentColumn); //取消其他表格的选中状态 emit CallManage::getInstance()->sig_UnSelectTableItem(m_indexID); } } } } void FormHead::slotCellChanged(int row, int column) { if(m_bRefresh==false) { //针对属性页修改了内容,避免重复刷新属性页 m_bRefresh=true; return; } if(row>=0 && column>=0) { auto myWidget = ui->tableWidget->cellWidget(row, column); if(myWidget) { FormTableItem* formTableItemTmp = (FormTableItem*)myWidget;//获得widget if(formTableItemTmp) { PropertyService()->initHeadProperty(this, ui->tableWidget, formTableItemTmp, row, column); //取消其他表格的选中状态 emit CallManage::getInstance()->sig_UnSelectTableItem(m_indexID); } } } } void FormHead::slotContextMenu(QPoint pos) { QMenu menu(ui->tableWidget); menu.addAction(QIcon(::GetImagePath() + "icon/Grid.png"), "复制", this, &FormHead::copy); menu.addAction(QIcon(::GetImagePath() + "icon/Grid.png"), "粘贴", this, &FormHead::Paste); menu.addSeparator(); QString strMenu= ""; if(m_strHeadOrTail == "Head") { strMenu= "保存为图头模板"; } else { strMenu= "保存为成果表模板"; } menu.addAction(QIcon(::GetImagePath() + "icon/Save.png"), strMenu, this, &FormHead::slotSaveJsonModel); menu.addSeparator(); menu.addAction(QIcon(::GetImagePath() + "icon/MergeCell.png"), "合并单元格", this, &FormHead::slotMerge); menu.addAction(QIcon(::GetImagePath() + "icon/Grid.png"), "拆分单元格", this, &FormHead::slotSplit); menu.addAction(QIcon(::GetImagePath() + "icon/Grid.png"), "边框", this, &FormHead::slotCellBorder); 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::slotSaveJsonModel() { m_parent->slotSaveJsonModel(); } //合并 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 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() 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); //合并后重新刷新 int iHight = ui->tableWidget->rowHeight(topRow); ui->tableWidget->setRowHeight(topRow, iHight+1); //恢复 ui->tableWidget->setRowHeight(topRow, iHight); } //边框 void FormHead::slotCellBorder() { QModelIndexList list = ui->tableWidget->selectionModel()->selectedIndexes(); if (list.size() != 1) { QMessageBox::warning(this, "边框设置", "请选择单个单元格", "确定"); return; } FormTableItem* formTableItemTmp = nullptr; int row = list[0].row(); int column = list[0].column(); if(row>=0 && column>=0) { auto myWidget = ui->tableWidget->cellWidget(row, column); if(myWidget) { formTableItemTmp = (FormTableItem*)myWidget;//获得widget } } if(!formTableItemTmp) { return; } CellBorderDlg dlgBorder(formTableItemTmp, this); dlgBorder.setFixedSize(QSize(667,414)); dlgBorder.setModal(false); Qt::WindowFlags flags = dlgBorder.windowFlags(); flags |= Qt::WindowStaysOnTopHint; flags &= ~Qt::WindowContextHelpButtonHint; dlgBorder.setWindowFlags(flags); dlgBorder.show(); if(dlgBorder.exec()!=QDialog::Accepted) { return; } } //拆分 void FormHead::slotSplit() { int row,col; QList selectRanges = ui->tableWidget->selectedRanges(); if (selectRanges.size() < 2) { QMessageBox::warning(this, "拆分表格失败", "单元格已是最小单位,不能再进行拆分", "确定"); return; } int topRow = 0; int leftCol = 0; int bottomRow = 0; int rightCol = 0; 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() bottomRow) bottomRow=range.bottomRow(); if(range.rightColumn()>rightCol) rightCol=range.rightColumn(); } ui->tableWidget->setSpan(topRow, leftCol, 1, 1); // 设置跨度为1 //合并后重新刷新 int iHight = ui->tableWidget->rowHeight(topRow); ui->tableWidget->setRowHeight(topRow, iHight+1); //恢复 ui->tableWidget->setRowHeight(topRow, iHight); } //前插入行 void FormHead::slotAddRow() { int row = ui->tableWidget->currentRow(); ui->tableWidget->insertRow(row); //新插入行,单元格初始化 int iCols = ui->tableWidget->columnCount(); for(int j=0; jtableWidget->setCellWidget(row, j, formTableItem); } //改变大小 resizeWindow(); } //后插入行 void FormHead::slotAddAfterRow() { int row = ui->tableWidget->currentRow(); ui->tableWidget->insertRow(row+1); //新插入行,单元格初始化 int iCols = ui->tableWidget->columnCount(); for(int j=0; jtableWidget->setCellWidget(row+1, j, formTableItem); } //改变大小 resizeWindow(); } //前插入列 void FormHead::slotAddCol() { int col = ui->tableWidget->currentColumn(); ui->tableWidget->insertColumn(col); //新插入行,单元格初始化 int iRows = ui->tableWidget->rowCount(); for(int j=0; jtableWidget->setCellWidget(j, col, formTableItem); } //改变大小 resizeWindow(); } //后插入列 void FormHead::slotAddAfterCol() { int col = ui->tableWidget->currentColumn(); ui->tableWidget->insertColumn(col+1); //新插入行,单元格初始化 int iRows = ui->tableWidget->rowCount(); for(int j=0; jtableWidget->setCellWidget(j, col+1, formTableItem); } //改变大小 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(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> selMap;//行,列 QModelIndexList list = ui->tableWidget->selectionModel()->selectedIndexes(); if (list.size() < 1) { QMessageBox::warning(this, "单元格拷贝", "请选中单元格", "确定"); return; } for(auto range:list) { int rowN = range.row(); int colN = range.column(); selMap[rowN].append(colN); } QString cpStr; QMap>::iterator it = selMap.begin(); while (it != selMap.end()) { for (int i = 0; i < (*it).count(); i++) { auto myWidget = ui->tableWidget->cellWidget(it.key(), (*it).at(i)); if(myWidget) { FormTableItem* formTableItemTmp = (FormTableItem*)myWidget;//获得widget if(formTableItemTmp) { cpStr.append(formTableItemTmp->m_strShowTxt.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.直接采用控件显示 // 保存为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"); // FormTableItem* formTableItemTmp = nullptr; auto myWidget = ui->tableWidget->cellWidget(rowN, colN); if(myWidget) { formTableItemTmp = (FormTableItem*)myWidget;//获得widget if(!formTableItemTmp) { return; } } else{ return; } formTableItemTmp->m_pixmap = pixmap; formTableItemTmp->m_strImg = folderPath; // 图片路径 formTableItemTmp->m_colWidth_Img = pixmap.width()/g_dPixelPerCm; //图例宽 formTableItemTmp->m_rowHeight_Img = pixmap.height()/g_dPixelPerCm; //图例高 formTableItemTmp->update(); // PropertyService()->initHeadProperty(this, ui->tableWidget, formTableItemTmp, 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; auto myWidget = ui->tableWidget->cellWidget(x, y); if(myWidget) { FormTableItem* formTableItemTmp = (FormTableItem*)myWidget;//获得widget if(formTableItemTmp) { formTableItemTmp->m_strShowTxt = rowDataList.at(j); formTableItemTmp->update(); } else { FormTableItem* formTableItem = new FormTableItem; formTableItem->m_strShowTxt = rowDataList.at(j); ui->tableWidget->setCellWidget(x, y, formTableItem); } } else { FormTableItem* formTableItem = new FormTableItem; formTableItem->m_strShowTxt = rowDataList.at(j); ui->tableWidget->setCellWidget(x, y, formTableItem); } } } } void FormHead::onPasteExcelData() { // QClipboard* clipboard = QApplication::clipboard(); // const QString clipData = clipboard->text(); // if (clipData.isEmpty()) return; // QList 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(); } void FormHead::getTableSize_Biggest(int &iWidth, int &iHight) { iWidth = 0; iHight = 0; int columnCount = ui->tableWidget->columnCount();//总列数 int rowCount = ui->tableWidget->rowCount();//总行数 for(int col=0; coltableWidget->cellWidget(0, col); if(myWidget) { formTableItemTmp = (FormTableItem*)myWidget;//获得widget if(!formTableItemTmp) { continue; } iWidth += formTableItemTmp->m_colWidth * g_dPixelPerCm; } else{ continue; } } for(int row=0; rowtableWidget->cellWidget(row, 0); if(myWidget) { formTableItemTmp = (FormTableItem*)myWidget;//获得widget if(!formTableItemTmp) { continue; } iHight += formTableItemTmp->m_rowHeight * g_dPixelPerCm; } else{ continue; } } iWidth += columnCount; iHight += rowCount; // int left, top, right, bottom; this->getContentsMargins(&left, &top, &right, &bottom); iWidth = iWidth + left + right; iHight = iHight + top + bottom;//Margin上方 // // if(ui->tableWidget->horizontalScrollBar()->isVisible()) { iWidth = iWidth + ui->tableWidget->verticalScrollBar()->width(); iHight = iHight + ui->tableWidget->horizontalScrollBar()->height(); } } //设置列宽 void FormHead::setColumnWidth_Property(int column, double width) { int rowCount = ui->tableWidget->rowCount();//总行数 for(int row=0; rowtableWidget->cellWidget(row, column); if(myWidget) { formTableItemTmp = (FormTableItem*)myWidget;//获得widget if(!formTableItemTmp) { continue; } formTableItemTmp->m_colWidth = width; } else{ continue; } } } //设置行高 void FormHead::setRowHeight_Property(int row, double height) { int columnCount = ui->tableWidget->columnCount();//总列数 for(int col=0; coltableWidget->cellWidget(row, col); if(myWidget) { formTableItemTmp = (FormTableItem*)myWidget;//获得widget if(!formTableItemTmp) { continue; } formTableItemTmp->m_rowHeight = height; } else{ continue; } } }