QLabel“破”字如果太长

问题描述

如果这些单词过长,有没有办法允许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的默认单词包装器包装的文本调整标签大小(这也需要重新实现以计算包装数)。您应该确保标签足够大以适合所有文本。