1

我正在使用 QTextTable 和 QTextTableFormat 创建 PDF 文件并将 HTML 代码插入表格单元格。

"<span style=\"font-weight: bold; font-size: %1px\">%2</span>"

我想缩小我的表格标题内容,使其适合 2 行。我使用 QFontMetrics 来计算我想要显示的字符串的宽度,然后开始减小字体大小直到它适合。我允许的最小字体大小是 8 像素,如果文本更宽,我会用 (.. .)。

问题:我计算单元格的最大宽度,假设为 50,因此,标题的 2 行宽度将为 100。我将文本缩小到 90 像素,如果文本像“iii”,它仍然不适合aaaaaaaaa”,因为第二个单词比第一个单词长很多。第一个单词将占据整个第一行,即使它只有大约 20 像素宽,第二个单词将分成两行,导致 3 行。

我正在寻找的是一种检测或计算给定QFontQString插入QTextDocument使用的方法QTextTableFormat是否会导致多少行

4

1 回答 1

2

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

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;
}

如果这恰好返回两行以上,您可以使用如下函数在第二行设置省略号:

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);
    //...
}
于 2020-01-14T11:38:24.017 回答