Qt 在写入 QTextTable 时检测分界线
Qt detect breakline when writing to QTextTable
我正在使用 QTextTable 和 QTextTableFormat 创建 PDF 文件并将 HTML 代码插入 table 单元格。
"<span style=\"font-weight: bold; font-size: %1px\">%2</span>"
我想缩小 table 的 header 内容,使其适合 2 行。我使用 QFontMetrics 来计算我想要显示的字符串的宽度,然后开始减小字体大小直到它适合。我允许的最小字体大小是 8 像素,如果文本更宽,我用 (.. .).
问题:我计算了单元格的最大宽度,假设为 50,因此,header 的 2 行宽度将为 100。我将文本缩小到 90 像素,但它仍然不会'如果文本类似于 "iii aaaaaaaaa",则不适合,因为第二个单词比第一个单词长很多。第一个词将占据整个第一行,即使它只有大约 20 像素宽,第二个词将分成两行
e 导致 3 行。
我正在寻找的是一种方法来检测或计算使用 QTextTableFormat
在 QTextDocument
上插入的给定 QFont
和 QString
是否会产生多少行
您可以使用像这样的简单函数来计算行数:
QStringList getLines(const QFontMetrics & metrics, const QString & source, const int maxwidth)
{
QStringList lines;
QString text;
for(auto c : source)
{
if(metrics.horizontalAdvance(text + c) > maxwidth)
{
lines << text;
text.clear();
}
text.append(c);
}
lines << text;
return lines;
}
如果 return 两行以上发生这种情况,您可以在第二行设置省略号,函数如下:
QString setEllipses(const QFontMetrics & metrics, const QString & source, const int maxwidth)
{
QString text;
int i = 0;
while((i <= source.length()) && (metrics.horizontalAdvance(text) < maxwidth))
{
text = source.left(++i) + " ...";
}
return text;
}
然后重新组合单元格文本,例如
auto lines = getLines(metrics, original_text, maxwidth);
if(lines.size() > 2)
{
QString celltext = lines[0] + "<br>" + setEllipses(metrics, lines[1], 300);
//...
}
我正在使用 QTextTable 和 QTextTableFormat 创建 PDF 文件并将 HTML 代码插入 table 单元格。
"<span style=\"font-weight: bold; font-size: %1px\">%2</span>"
我想缩小 table 的 header 内容,使其适合 2 行。我使用 QFontMetrics 来计算我想要显示的字符串的宽度,然后开始减小字体大小直到它适合。我允许的最小字体大小是 8 像素,如果文本更宽,我用 (.. .).
问题:我计算了单元格的最大宽度,假设为 50,因此,header 的 2 行宽度将为 100。我将文本缩小到 90 像素,但它仍然不会'如果文本类似于 "iii aaaaaaaaa",则不适合,因为第二个单词比第一个单词长很多。第一个词将占据整个第一行,即使它只有大约 20 像素宽,第二个词将分成两行 e 导致 3 行。
我正在寻找的是一种方法来检测或计算使用 QTextTableFormat
在 QTextDocument
上插入的给定 QFont
和 QString
是否会产生多少行
您可以使用像这样的简单函数来计算行数:
QStringList getLines(const QFontMetrics & metrics, const QString & source, const int maxwidth)
{
QStringList lines;
QString text;
for(auto c : source)
{
if(metrics.horizontalAdvance(text + c) > maxwidth)
{
lines << text;
text.clear();
}
text.append(c);
}
lines << text;
return lines;
}
如果 return 两行以上发生这种情况,您可以在第二行设置省略号,函数如下:
QString setEllipses(const QFontMetrics & metrics, const QString & source, const int maxwidth)
{
QString text;
int i = 0;
while((i <= source.length()) && (metrics.horizontalAdvance(text) < maxwidth))
{
text = source.left(++i) + " ...";
}
return text;
}
然后重新组合单元格文本,例如
auto lines = getLines(metrics, original_text, maxwidth);
if(lines.size() > 2)
{
QString celltext = lines[0] + "<br>" + setEllipses(metrics, lines[1], 300);
//...
}