如何对齐文本和图像,如 Qt 中提供的示例图像?
How to align text and images like the sample image provided in Qt?
我想在生成的PDF文件中显示图像和文本,我不知道如何进行。
起初我试过这个:
for(int i=0; i<COVDATA.COV_ComponentName.size(); i++){
//------------------------------------------------------------------------------------
x = x + 550;
y = y + 150;
// ScreenShot_path = COVDATA.COV_ComponentScreenShot[i];
// img = QImage(ScreenShot_path);
// painter.drawImage(QRect(100,y,210,150),img.scaled( 800 , 800, Qt::KeepAspectRatio) );
// painter.setPen(QPen(Qt::black, 5));
// painter.setFont(OpenSans);
// painter.setFont(QFont("Open Sans",10,QFont::Normal));
// painter.drawText( QRect(0,y,PageWidth-210,150), Qt::AlignRight|Qt::AlignVCenter, COVDATA.COV_ComponentName[i]);
if(i % 2 == 0 || i==0){
painter.setPen(QPen(Qt::black, 5));
painter.setFont(OpenSans);
painter.setFont(QFont("Open Sans",10,QFont::Normal));
painter.drawText( QRect(0,y,210,150), Qt::AlignLeft|Qt::AlignVCenter, COVDATA.COV_ComponentName[i]);
ScreenShot_path = COVDATA.COV_ComponentScreenShot[i];
img = QImage(ScreenShot_path);
painter.drawImage(QRect(150,y+350,210,450),img.scaled( 800 , 800, Qt::KeepAspectRatio) );
}else{
painter.setPen(QPen(Qt::black, 5));
painter.setFont(OpenSans);
painter.setFont(QFont("Open Sans",10,QFont::Normal));
painter.drawText( QRect(0,y,PageWidth-210,150), Qt::AlignRight|Qt::AlignVCenter, COVDATA.COV_ComponentName[i]);
ScreenShot_path = COVDATA.COV_ComponentScreenShot[i];
img = QImage(ScreenShot_path);
painter.drawImage(QRect(0,y+350,210,350),img.scaled( 800 , 800, Qt::KeepAspectRatio) );
}
}
但这对我来说并没有真正解决,老实说,我不知道如何继续下去。 COVDATA.COV_ComponentName 是一个列表,其中包含我要打印的文本,而 COVDATA.COV_ComponentScheenShot 是一个列表,其中包含调用的图像的存储位置,并将图像存储在 QImage 对象中以供生成。
这些将打印在我的 PDF 文件中。
您的坐标计算未按预期进行。我整理了一个简短的示例来说明如何根据需要实施布局:
QStringList Text;
Text << "String 1" << "String 2" << "String 3" << "String 4" << "String 5" << "String 6" << "String 7" << "String 8";
int TextHeight = painter.fontMetrics().height() * 1.5;
int Padding = 10;
int NumOfColumns = 2;
int RectWidth = (geometry().width() - (NumOfColumns+1) * Padding) / NumOfColumns;
int NumOfRows = std::ceil(Text.size() / static_cast<float>(NumOfColumns)); // std::ceil requires #include <cmath>
int RectHeight = (geometry().height() - NumOfRows * TextHeight - (NumOfRows + 1) * Padding) / NumOfRows;
for (int i = 0; i < Text.size(); i++)
{
int x = Padding + (i % NumOfColumns) * (RectWidth + Padding);
int y = Padding + (i / NumOfColumns) * (RectHeight + TextHeight + Padding);
painter.setPen(QPen(Qt::black, 2));
painter.drawText(QRect(x, y, RectWidth, TextHeight), Qt::AlignLeft | Qt::AlignVCenter, Text[i]);
painter.drawRect(QRect(x, y + TextHeight, RectWidth, RectHeight));
}
我用简单的文本和矩形列表替换了 COVDATA 内容和屏幕截图。
使用上面的代码,您可以配置列数(行数将根据我的列表 Text
中的所有项目都在屏幕上的位置计算)以及矩形之间的填充。
但是原理要清楚:
- 我根据索引 i 计算 x 和 y 分量
- 根据为矩形分配的 space 的预定义宽度和高度计算坐标,在我的例子中,这被设置为小部件可用的完整 space 的一小部分(所以它也适应本机调整大小)。
结果是这样的:
我想在生成的PDF文件中显示图像和文本,我不知道如何进行。
起初我试过这个:
for(int i=0; i<COVDATA.COV_ComponentName.size(); i++){
//------------------------------------------------------------------------------------
x = x + 550;
y = y + 150;
// ScreenShot_path = COVDATA.COV_ComponentScreenShot[i];
// img = QImage(ScreenShot_path);
// painter.drawImage(QRect(100,y,210,150),img.scaled( 800 , 800, Qt::KeepAspectRatio) );
// painter.setPen(QPen(Qt::black, 5));
// painter.setFont(OpenSans);
// painter.setFont(QFont("Open Sans",10,QFont::Normal));
// painter.drawText( QRect(0,y,PageWidth-210,150), Qt::AlignRight|Qt::AlignVCenter, COVDATA.COV_ComponentName[i]);
if(i % 2 == 0 || i==0){
painter.setPen(QPen(Qt::black, 5));
painter.setFont(OpenSans);
painter.setFont(QFont("Open Sans",10,QFont::Normal));
painter.drawText( QRect(0,y,210,150), Qt::AlignLeft|Qt::AlignVCenter, COVDATA.COV_ComponentName[i]);
ScreenShot_path = COVDATA.COV_ComponentScreenShot[i];
img = QImage(ScreenShot_path);
painter.drawImage(QRect(150,y+350,210,450),img.scaled( 800 , 800, Qt::KeepAspectRatio) );
}else{
painter.setPen(QPen(Qt::black, 5));
painter.setFont(OpenSans);
painter.setFont(QFont("Open Sans",10,QFont::Normal));
painter.drawText( QRect(0,y,PageWidth-210,150), Qt::AlignRight|Qt::AlignVCenter, COVDATA.COV_ComponentName[i]);
ScreenShot_path = COVDATA.COV_ComponentScreenShot[i];
img = QImage(ScreenShot_path);
painter.drawImage(QRect(0,y+350,210,350),img.scaled( 800 , 800, Qt::KeepAspectRatio) );
}
}
但这对我来说并没有真正解决,老实说,我不知道如何继续下去。 COVDATA.COV_ComponentName 是一个列表,其中包含我要打印的文本,而 COVDATA.COV_ComponentScheenShot 是一个列表,其中包含调用的图像的存储位置,并将图像存储在 QImage 对象中以供生成。 这些将打印在我的 PDF 文件中。
您的坐标计算未按预期进行。我整理了一个简短的示例来说明如何根据需要实施布局:
QStringList Text;
Text << "String 1" << "String 2" << "String 3" << "String 4" << "String 5" << "String 6" << "String 7" << "String 8";
int TextHeight = painter.fontMetrics().height() * 1.5;
int Padding = 10;
int NumOfColumns = 2;
int RectWidth = (geometry().width() - (NumOfColumns+1) * Padding) / NumOfColumns;
int NumOfRows = std::ceil(Text.size() / static_cast<float>(NumOfColumns)); // std::ceil requires #include <cmath>
int RectHeight = (geometry().height() - NumOfRows * TextHeight - (NumOfRows + 1) * Padding) / NumOfRows;
for (int i = 0; i < Text.size(); i++)
{
int x = Padding + (i % NumOfColumns) * (RectWidth + Padding);
int y = Padding + (i / NumOfColumns) * (RectHeight + TextHeight + Padding);
painter.setPen(QPen(Qt::black, 2));
painter.drawText(QRect(x, y, RectWidth, TextHeight), Qt::AlignLeft | Qt::AlignVCenter, Text[i]);
painter.drawRect(QRect(x, y + TextHeight, RectWidth, RectHeight));
}
我用简单的文本和矩形列表替换了 COVDATA 内容和屏幕截图。
使用上面的代码,您可以配置列数(行数将根据我的列表 Text
中的所有项目都在屏幕上的位置计算)以及矩形之间的填充。
但是原理要清楚:
- 我根据索引 i 计算 x 和 y 分量
- 根据为矩形分配的 space 的预定义宽度和高度计算坐标,在我的例子中,这被设置为小部件可用的完整 space 的一小部分(所以它也适应本机调整大小)。
结果是这样的: