Qt обнаруживает разрыв при записи в QTextTable - PullRequest
1 голос
/ 14 января 2020

Я использую 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 строки.

Я ищу способ обнаружения или вычислите, если данные QFont и QString, вставленные в QTextDocument с использованием QTextTableFormat, приведут к тому, сколько строк

1 Ответ

1 голос
/ 14 января 2020

Вы можете посчитать строки, используя тривиальную функцию, подобную этой:

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