输出图片\pdf\svg中,追加图头、尾部结果部分。

This commit is contained in:
jiayulong 2026-04-02 17:47:35 +08:00
parent 02a218c0fb
commit a74b15aa18
3 changed files with 239 additions and 49 deletions

View File

@ -348,3 +348,22 @@ void FormMultiHeads::DisplayHeads(QJsonArray headsArray, QString strHeadOrTail)
} }
} }
} }
//获取图头、结论的宽高,方便输出图
void FormMultiHeads::getTableSize(int &iWidth, int &iHight)
{
//获取可视视图大小 tableWidget
iHight = 0;
iWidth = 0;
for(int i=0; i<ui->tableWidget->rowCount(); i++)
{
//高度
iHight += ui->tableWidget->rowHeight(i);
}
for(int j=0; j<ui->tableWidget->columnCount(); j++)
{
//高度
iWidth += ui->tableWidget->columnWidth(j);
}
}

View File

@ -39,6 +39,9 @@ public:
//Head代表图头 Tail代表成果表 //Head代表图头 Tail代表成果表
void DisplayHeads(QJsonArray headsArray, QString strHeadOrTail); void DisplayHeads(QJsonArray headsArray, QString strHeadOrTail);
//获取图头、结论的宽高,方便输出图
void getTableSize(int &iWidth, int &iHight);
public: public:
QString m_strHeadOrTail = ""; //Head代表图头 Tail代表成果表 QString m_strHeadOrTail = ""; //Head代表图头 Tail代表成果表
}; };

View File

@ -2362,10 +2362,6 @@ void MainWindowCurve::s_SaveAsPicture()
return; return;
} }
// 获取客户区几何信息(不含边框)
QRect geoRect = ui->centralwidget->geometry();
qDebug() << "Geometry:" << geoRect.x() << "," << geoRect.y()
<< "w:" << geoRect.width() << "h:" << geoRect.height();
//获取可视视图大小 tableWidget_2 //获取可视视图大小 tableWidget_2
int iHight = 0; int iHight = 0;
@ -2375,20 +2371,83 @@ void MainWindowCurve::s_SaveAsPicture()
//高度 //高度
iHight += ui->tableWidget_2->rowHeight(i); iHight += ui->tableWidget_2->rowHeight(i);
} }
//ui->tableWidget_2->setRowHeight(1, iHight+200);
//iHight += 3000;
for(int j=0; j<ui->tableWidget_2->columnCount(); j++) for(int j=0; j<ui->tableWidget_2->columnCount(); j++)
{ {
// //
iWidth += ui->tableWidget_2->columnWidth(j); iWidth += ui->tableWidget_2->columnWidth(j);
} }
//
bool bVisible = m_dock1->isVisible();
//第一次显示判断是否从json加载
if(m_bHeadLoadJson)
{
m_bHeadLoadJson = false;
QString strHeadOrTail = ""; //Head代表图头 Tail代表成果表
//展示所有图头
strHeadOrTail = "Head"; //Head代表图头 Tail代表成果表
m_formMultiHeads->DisplayHeads(m_headsArray, strHeadOrTail);
//展示所有成果表
strHeadOrTail = "Tail"; //Head代表图头 Tail代表成果表
m_formMultiTails->DisplayHeads(m_tailsArray, strHeadOrTail);
}
m_dock1->show();
m_dock2->show();
//-----------------------------
//头
int iWidth_Head, iHight_Head;
m_formMultiHeads->getTableSize(iWidth_Head, iHight_Head);
QRect geoRect_FormHead = m_dock1->geometry();
m_dock1->setGeometry(geoRect_FormHead.x(), geoRect_FormHead.y(), iWidth_Head, iHight_Head);
//中间
// 获取客户区几何信息(不含边框)
QRect geoRect = ui->centralwidget->geometry();
qDebug() << "Geometry:" << geoRect.x() << "," << geoRect.y()
<< "w:" << geoRect.width() << "h:" << geoRect.height();
//指标体系图 //指标体系图
ui->centralwidget->setGeometry(geoRect.x(), geoRect.y(), iWidth, iHight); ui->centralwidget->setGeometry(geoRect.x(), geoRect.y(), iWidth, iHight);
QPixmap pPixmap = ui->centralwidget->grab(QRect(0, 0, ui->centralwidget->width(), ui->centralwidget->height()));
//尾
int iWidth_Tail, iHight_Tail;
m_formMultiTails->getTableSize(iWidth_Tail, iHight_Tail);
QRect geoRect_Tail = m_dock2->geometry();
m_dock2->setGeometry(geoRect_Tail.x(), iHight+iHight_Head+40, iWidth_Tail, iHight_Tail);
//-----------------------------
//QPixmap pPixmap = ui->centralwidget->grab(QRect(0, 0, ui->centralwidget->width(), ui->centralwidget->height()));
int iMaxWidth = iWidth;
if(iWidth_Head>iWidth_Tail)
{
if(iWidth_Head>iWidth)
{
iMaxWidth = iWidth_Head;
}
}
else
{
if(iWidth_Tail>iWidth)
{
iMaxWidth = iWidth_Tail;
}
}
QPixmap pPixmap = this->grab(QRect(geoRect_FormHead.x(), geoRect_FormHead.y(), iMaxWidth, iHight+iHight_Head+iHight_Tail+40));
pPixmap.save(pngName); pPixmap.save(pngName);
//恢复窗口 //恢复窗口
m_dock1->setGeometry(geoRect_FormHead.x(), geoRect_FormHead.y(), geoRect_FormHead.width(), geoRect_FormHead.height());
ui->centralwidget->setGeometry(geoRect.x(), geoRect.y(), geoRect.width(), geoRect.height()); ui->centralwidget->setGeometry(geoRect.x(), geoRect.y(), geoRect.width(), geoRect.height());
m_dock2->setGeometry(geoRect_Tail.x(), geoRect_Tail.y(), geoRect_Tail.width(), geoRect_Tail.height());
if(!bVisible)
{
m_dock1->hide();
m_dock2->hide();
}
} }
//导出PDF //导出PDF
@ -2416,29 +2475,91 @@ void MainWindowCurve::s_SaveAsPdf()
return; return;
} }
// 获取客户区几何信息(不含边框)
QRect geoRect = ui->centralwidget->geometry();
qDebug() << "Geometry:" << geoRect.x() << "," << geoRect.y()
<< "w:" << geoRect.width() << "h:" << geoRect.height();
//获取可视视图大小 tableWidget_2 //获取可视视图大小 tableWidget_2
int iHight = 0; int iHight = 0;
int iWidth = 0; int iWidth = 0;
for(int i=0; i<2; i++) for(int i=0; i<ui->tableWidget_2->rowCount(); i++)
{ {
//高度 //高度
iHight += ui->tableWidget_2->rowHeight(i); iHight += ui->tableWidget_2->rowHeight(i);
} }
//ui->tableWidget_2->setRowHeight(1, iHight+200);
//iHight += 3000;
for(int j=0; j<ui->tableWidget_2->columnCount(); j++) for(int j=0; j<ui->tableWidget_2->columnCount(); j++)
{ {
// //
iWidth += ui->tableWidget_2->columnWidth(j); iWidth += ui->tableWidget_2->columnWidth(j);
} }
//
bool bVisible = m_dock1->isVisible();
//第一次显示判断是否从json加载
if(m_bHeadLoadJson)
{
m_bHeadLoadJson = false;
QString strHeadOrTail = ""; //Head代表图头 Tail代表成果表
//展示所有图头
strHeadOrTail = "Head"; //Head代表图头 Tail代表成果表
m_formMultiHeads->DisplayHeads(m_headsArray, strHeadOrTail);
//展示所有成果表
strHeadOrTail = "Tail"; //Head代表图头 Tail代表成果表
m_formMultiTails->DisplayHeads(m_tailsArray, strHeadOrTail);
}
m_dock1->show();
m_dock2->show();
//-----------------------------
//头
int iWidth_Head, iHight_Head;
m_formMultiHeads->getTableSize(iWidth_Head, iHight_Head);
QRect geoRect_FormHead = m_dock1->geometry();
m_dock1->setGeometry(geoRect_FormHead.x(), geoRect_FormHead.y(), iWidth_Head, iHight_Head);
//中间
// 获取客户区几何信息(不含边框)
QRect geoRect = ui->centralwidget->geometry();
qDebug() << "Geometry:" << geoRect.x() << "," << geoRect.y()
<< "w:" << geoRect.width() << "h:" << geoRect.height();
//指标体系图 //指标体系图
ui->centralwidget->setGeometry(geoRect.x(), geoRect.y(), iWidth, iHight); ui->centralwidget->setGeometry(geoRect.x(), geoRect.y(), iWidth, iHight);
QPixmap pPixmap = ui->centralwidget->grab(QRect(0, 0, ui->centralwidget->width(), ui->centralwidget->height()));
//尾
int iWidth_Tail, iHight_Tail;
m_formMultiTails->getTableSize(iWidth_Tail, iHight_Tail);
QRect geoRect_Tail = m_dock2->geometry();
m_dock2->setGeometry(geoRect_Tail.x(), iHight+iHight_Head+40, iWidth_Tail, iHight_Tail);
//-----------------------------
//QPixmap pPixmap = ui->centralwidget->grab(QRect(0, 0, ui->centralwidget->width(), ui->centralwidget->height()));
int iMaxWidth = iWidth;
if(iWidth_Head>iWidth_Tail)
{
if(iWidth_Head>iWidth)
{
iMaxWidth = iWidth_Head;
}
}
else
{
if(iWidth_Tail>iWidth)
{
iMaxWidth = iWidth_Tail;
}
}
QPixmap pPixmap = this->grab(QRect(geoRect_FormHead.x(), geoRect_FormHead.y(), iMaxWidth, iHight+iHight_Head+iHight_Tail+40));
//pPixmap.save(pngName);
//恢复窗口
m_dock1->setGeometry(geoRect_FormHead.x(), geoRect_FormHead.y(), geoRect_FormHead.width(), geoRect_FormHead.height());
ui->centralwidget->setGeometry(geoRect.x(), geoRect.y(), geoRect.width(), geoRect.height());
m_dock2->setGeometry(geoRect_Tail.x(), geoRect_Tail.y(), geoRect_Tail.width(), geoRect_Tail.height());
if(!bVisible)
{
m_dock1->hide();
m_dock2->hide();
}
// //
QPrinter printer;//(QPrinter::ScreenResolution); QPrinter printer;//(QPrinter::ScreenResolution);
@ -2454,7 +2575,7 @@ void MainWindowCurve::s_SaveAsPdf()
printer.setOrientation(QPrinter::Portrait); printer.setOrientation(QPrinter::Portrait);
printer.setPaperSize(QPrinter::Custom); printer.setPaperSize(QPrinter::Custom);
printer.setPaperSize(QSizeF(ui->centralwidget->width(), ui->centralwidget->height()),QPrinter::DevicePixel); printer.setPaperSize(QSizeF(iMaxWidth, iHight+iHight_Head+iHight_Tail+40),QPrinter::DevicePixel);
// //
float sx=1; float sx=1;
@ -2465,9 +2586,6 @@ void MainWindowCurve::s_SaveAsPdf()
painter.scale(sx,sy); painter.scale(sx,sy);
painter.drawPixmap(0, 0, pPixmap); painter.drawPixmap(0, 0, pPixmap);
painter.end(); painter.end();
//恢复窗口
ui->centralwidget->setGeometry(geoRect.x(), geoRect.y(), geoRect.width(), geoRect.height());
} }
//导出长图 //导出长图
@ -2494,44 +2612,105 @@ void MainWindowCurve::s_SaveAsSvg()
if(pngName=="") { if(pngName=="") {
return; return;
} }
// 获取客户区几何信息(不含边框)
QRect geoRect = ui->centralwidget->geometry();
qDebug() << "Geometry:" << geoRect.x() << "," << geoRect.y()
<< "w:" << geoRect.width() << "h:" << geoRect.height();
//获取可视视图大小 tableWidget_2 //获取可视视图大小 tableWidget_2
int iHight = 0; int iHight = 0;
int iWidth = 0; int iWidth = 0;
for(int i=0; i<2; i++) for(int i=0; i<ui->tableWidget_2->rowCount(); i++)
{ {
//高度 //高度
iHight += ui->tableWidget_2->rowHeight(i); iHight += ui->tableWidget_2->rowHeight(i);
} }
//ui->tableWidget_2->setRowHeight(1, iHight+200);
//iHight += 3000;
for(int j=0; j<ui->tableWidget_2->columnCount(); j++) for(int j=0; j<ui->tableWidget_2->columnCount(); j++)
{ {
// //
iWidth += ui->tableWidget_2->columnWidth(j); iWidth += ui->tableWidget_2->columnWidth(j);
} }
//
bool bVisible = m_dock1->isVisible();
//第一次显示判断是否从json加载
if(m_bHeadLoadJson)
{
m_bHeadLoadJson = false;
QString strHeadOrTail = ""; //Head代表图头 Tail代表成果表
//展示所有图头
strHeadOrTail = "Head"; //Head代表图头 Tail代表成果表
m_formMultiHeads->DisplayHeads(m_headsArray, strHeadOrTail);
//展示所有成果表
strHeadOrTail = "Tail"; //Head代表图头 Tail代表成果表
m_formMultiTails->DisplayHeads(m_tailsArray, strHeadOrTail);
}
m_dock1->show();
m_dock2->show();
//-----------------------------
//头
int iWidth_Head, iHight_Head;
m_formMultiHeads->getTableSize(iWidth_Head, iHight_Head);
QRect geoRect_FormHead = m_dock1->geometry();
m_dock1->setGeometry(geoRect_FormHead.x(), geoRect_FormHead.y(), iWidth_Head, iHight_Head);
//中间
// 获取客户区几何信息(不含边框)
QRect geoRect = ui->centralwidget->geometry();
qDebug() << "Geometry:" << geoRect.x() << "," << geoRect.y()
<< "w:" << geoRect.width() << "h:" << geoRect.height();
//指标体系图 //指标体系图
ui->centralwidget->setGeometry(geoRect.x(), geoRect.y(), iWidth, iHight); ui->centralwidget->setGeometry(geoRect.x(), geoRect.y(), iWidth, iHight);
QPixmap pPixmap = ui->centralwidget->grab(QRect(0, 0, ui->centralwidget->width(), ui->centralwidget->height()));
//尾
int iWidth_Tail, iHight_Tail;
m_formMultiTails->getTableSize(iWidth_Tail, iHight_Tail);
QRect geoRect_Tail = m_dock2->geometry();
m_dock2->setGeometry(geoRect_Tail.x(), iHight+iHight_Head+40, iWidth_Tail, iHight_Tail);
//-----------------------------
//QPixmap pPixmap = ui->centralwidget->grab(QRect(0, 0, ui->centralwidget->width(), ui->centralwidget->height()));
int iMaxWidth = iWidth;
if(iWidth_Head>iWidth_Tail)
{
if(iWidth_Head>iWidth)
{
iMaxWidth = iWidth_Head;
}
}
else
{
if(iWidth_Tail>iWidth)
{
iMaxWidth = iWidth_Tail;
}
}
QPixmap pPixmap = this->grab(QRect(geoRect_FormHead.x(), geoRect_FormHead.y(), iMaxWidth, iHight+iHight_Head+iHight_Tail+40));
//pPixmap.save(pngName);
//恢复窗口
m_dock1->setGeometry(geoRect_FormHead.x(), geoRect_FormHead.y(), geoRect_FormHead.width(), geoRect_FormHead.height());
ui->centralwidget->setGeometry(geoRect.x(), geoRect.y(), geoRect.width(), geoRect.height());
m_dock2->setGeometry(geoRect_Tail.x(), geoRect_Tail.y(), geoRect_Tail.width(), geoRect_Tail.height());
if(!bVisible)
{
m_dock1->hide();
m_dock2->hide();
}
// //
QString strTmpPng = pngName; // QString strTmpPng = pngName;
int indTmp=strTmpPng.lastIndexOf("."); // int indTmp=strTmpPng.lastIndexOf(".");
if(indTmp>=0) strTmpPng=strTmpPng.left(indTmp) + "_tmp.PNG"; // if(indTmp>=0) strTmpPng=strTmpPng.left(indTmp) + "_tmp.PNG";
pPixmap.save(strTmpPng); // pPixmap.save(strTmpPng);
// QImage image;
// image.load(strTmpPng);
QSvgGenerator generator; QSvgGenerator generator;
generator.setFileName(pngName); // 设置输出SVG文件的路径和名称 generator.setFileName(pngName); // 设置输出SVG文件的路径和名称
generator.setSize(QSize(ui->centralwidget->width(), ui->centralwidget->height())); // 设置SVG的尺寸这里使用QPixmap的尺寸 generator.setSize(QSize(iMaxWidth, iHight+iHight_Head+iHight_Tail+40)); // 设置SVG的尺寸这里使用QPixmap的尺寸
generator.setViewBox(QRect(0, 0, ui->centralwidget->width(), ui->centralwidget->height())); // 设置视图框,可选,根据需要设置 generator.setViewBox(QRect(0, 0, iMaxWidth, iHight+iHight_Head+iHight_Tail+40)); // 设置视图框,可选,根据需要设置
QImage image;
image.load(strTmpPng);
// //
float sx=1; float sx=1;
float sy=1; float sy=1;
@ -2539,21 +2718,10 @@ void MainWindowCurve::s_SaveAsSvg()
painter.begin(&generator); painter.begin(&generator);
painter.setRenderHint(QPainter::Antialiasing); painter.setRenderHint(QPainter::Antialiasing);
painter.scale(sx,sy); painter.scale(sx,sy);
//painter.drawPixmap(0, 0, pPixmap); // 绘制QPixmap到SVG中 painter.drawPixmap(0, 0, pPixmap); // 绘制QPixmap到SVG中
painter.drawImage(0, 0, image); //painter.drawImage(0, 0, image);
painter.end(); // 结束绘制过程 painter.end(); // 结束绘制过程
// float sx=1;
// float sy=1;
// QPainter painter;
// painter.begin(&generator);
// painter.setRenderHint(QPainter::Antialiasing);
// painter.scale(sx,sy);
// painter.drawPixmap(0, 0, pPixmap); // 绘制QPixmap到SVG中
// painter.end(); // 结束绘制过程
//恢复窗口
ui->centralwidget->setGeometry(geoRect.x(), geoRect.y(), geoRect.width(), geoRect.height());
} }
//void MainWindowCurve::s_Open(QString fileFull) //void MainWindowCurve::s_Open(QString fileFull)