C++ QLabel";“中断”;如果单词太长

C++ QLabel";“中断”;如果单词太长,c++,string,qt,widget,label,C++,String,Qt,Widget,Label,如果单词太长,是否有方法允许QLabel中断这些单词?我见过 q_label->setWordWrap(true) 但它适用于空格,但如果单个单词太长,则会溢出… 我想要一些类似于wordbreak:break all的东西用于web开发 我也看过QTextDocument,但它不允许有固定的宽度和非固定的高度据我所知,没有现成的方法可以自动将单词分成几行,用于QLabel 您可以编写代码或在文本中以固定长度手动插入换行符或空格,以便QLabel::setWordWrap()可以正常工作

如果单词太长,是否有方法允许
QLabel
中断这些单词?我见过

q_label->setWordWrap(true)
但它适用于空格,但如果单个单词太长,则会溢出…
我想要一些类似于
wordbreak:break all
的东西用于web开发


我也看过
QTextDocument
,但它不允许有固定的宽度和非固定的高度

据我所知,没有现成的方法可以自动将单词分成几行,用于
QLabel

您可以编写代码或在文本中以固定长度手动插入换行符或空格,以便
QLabel::setWordWrap()
可以正常工作

QLabel*pLabel=新的QLabel(此);
pLabel->setText(“第一行\n第二行\n第三行”);
pLabel->setWordWrap(真);

你也可以使用。它的
setDefaultTextOption
方法允许您设置默认值。和
qtexoption::setWrapMode(qtexoption::WrapAnywhere)
允许在一行上的任何点包装文本。

您可以使用一个函数,每当一个单词大于标签的最大大小时,就添加一个空格。如果要限制字符计数中的字长,则应执行以下操作:

void wrapLabelByCharCount(QLabel*label,int characterCount)
{
QString text=标签->文本();
int字长=0;
bool-insideWord=false;
QFontMetrics fontMetrics(标签->字体());
对于(int i=0;i字符数)
{
text=text.left(i)+“\n”+text.right(text.length()-i);
标签->设置固定高度(标签->高度()+fontMetrics.height());
insideWord=假;
}
}
标签->设置文本(文本);
}
如果要基于固定像素宽度包装单词,则应使用此选项:

void wrapLabelByTextSize(QLabel*标签,整数宽度像素)
{
QString text=标签->文本();
QString word=“”;
bool-insideWord=false;
QFontMetrics fontMetrics(标签->字体());
对于(int i=0;i宽度像素)
{
text=text.left(i)+“\n”+text.right(text.length()-i);
标签->设置固定高度(标签->高度()+fontMetrics.height());
insideWord=假;
}
}
标签->设置文本(文本);
}
以下是一些如何使用这些的示例:

q_标签->setWordWrap(true)//这是工作所必需的
wrapLabelByCharCount(q_标签,15);//包装所有超过15个字符的单词
wrapLabelByTextSize(q_标签,q_标签->宽度());//包装超过标签宽度的单词(这可能是您想要的)
wrapLabelByTextSize(q_标签,25);//包装超过25像素的单词

编辑:需要注意的是,这些函数不会为QLabel的默认word包装器包装的文本调整标签大小(这也需要重新实现才能计算包装的数量)。您应该确保标签足够大以容纳所有文本。

QTextDocument
不允许有固定的宽度和非固定的高度如何?您可以创建自己的标签,并在
paintEvent()
方法中,使用
drawText()
Qt::textrpanywhere
标志