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 行。

我正在寻找的是一种方法来检测或计算使用 QTextTableFormatQTextDocument 上插入的给定 QFontQString 是否会产生多少行

您可以使用像这样的简单函数来计算行数:

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);
    //...
}