gpt4 book ai didi

c++ - Qt写入QTextTable时检测断线

转载 作者:行者123 更新时间:2023-12-02 10:22:01 25 4
gpt4 key购买 nike

我正在使用QTextTable和QTextTableFormat创建PDF文件,并将HTML代码插入表格单元格。
"<span style=\"font-weight: bold; font-size: %1px\">%2</span>"
我想缩小表格标题内容,使其适合2行。我使用QFontMetrics来计算我要显示的字符串的宽度,然后开始减小字体大小直到适合它。我允许的最小字体大小是8pixel,如果文本更宽,我用(。 )。

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

我正在寻找的是一种检测或计算使用QFont插入到QString上的给定QTextDocumentQTextTableFormat是否会导致多少行的方法

最佳答案

您可以使用以下简单函数来计算行数:

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

关于c++ - Qt写入QTextTable时检测断线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59732038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com