问题描述
如果这些单词过长,有没有办法允许QLabel
打破这些单词?我看过
q_label->setWordWrap(true)
但是它可以使用空格,但是如果单个单词太长,则会溢出...
我想要类似word-break: break-all
的网站开发
我也见过QTextDocument
,但是它不允许具有固定的宽度和不固定的高度
解决方法
据我所知,没有现成的方法可以自动将QLabel
的单词分成几行。
您可以编码或以固定长度在文本中手动插入换行符或空格,以便QLabel::setWordWrap()
可以正常工作。
QLabel *pLabel = new QLabel(this);
pLabel->setText("first line\nsecond line\nthird line\n");
pLabel->setWordWrap(true);
您也可以使用QTextDocument。其setDefaultTextOption
方法允许您设置QTextOption。并且QTextOption::setWrapMode(QTextOption::WrapAnywhere)
允许在一行的任何位置换行。
您可以使用一个函数,当单词大于标签的最大大小时,该函数会增加一个空格。如果您想限制字符数中的单词长度,这应该起作用:
myUID="$(id)"
myUID="${myUID#*=}"
myUID="${myUID%%(*}"
如果要基于固定的像素宽度来包装单词,则应使用此选项:
void wrapLabelByCharCount(QLabel *label,int characterCount)
{
QString text = label->text();
int wordLength = 0;
bool insideWord = false;
QFontMetrics fontMetrics(label->font());
for (int i = 0; i < text.length(); i++)
{
if (text[i] == ' ' || text[i] == '\t' || text[i] == '\n')
insideWord = false;
else
{
if (!insideWord)
{
insideWord = true;
wordLength = 0;
}
++wordLength;
}
if (wordLength > characterCount)
{
text = text.left(i) + "\n" + text.right(text.length() - i);
label->setFixedHeight(label->height() + fontMetrics.height());
insideWord = false;
}
}
label->setText(text);
}
以下是一些如何使用这些示例:
void wrapLabelByTextSize(QLabel *label,int widthInPixels)
{
QString text = label->text();
QString word = "";
bool insideWord = false;
QFontMetrics fontMetrics(label->font());
for (int i = 0; i < text.length(); i++)
{
if (text[i] == ' ' || text[i] == '\t' || text[i] == '\n')
insideWord = false;
else
{
if (!insideWord)
{
insideWord = true;
word = "";
}
word += text[i];
}
if (fontMetrics.horizontalAdvance(word) > widthInPixels)
{
text = text.left(i) + "\n" + text.right(text.length() - i);
label->setFixedHeight(label->height() + fontMetrics.height());
insideWord = false;
}
}
label->setText(text);
}
编辑:重要的是要注意,这些功能不会为QLabel的默认单词包装器包装的文本调整标签大小(这也需要重新实现以计算包装数)。您应该确保标签足够大以适合所有文本。