ui->label->setWordWrap(true);
这里必须好好的说下,这个自动换行的代码存在2个BUG
1、自动换行针对纯数字、纯字母不会自动换行,这个是QT的一个BUG
2、自动换行会导致外部的scrollArea里面的verticalScrollBar中的range不正确,去掉了setWordWrap,scrollArea才正确
为了充分解决这2个问题产生的bug,这里我们重载QLabel,根据字体、宽、高自动去计算应该显示的文字
#ifndef AUTOWRAPLABEL_H
#define AUTOWRAPLABEL_H
#include <QLabel>
#include <QResizeEvent>
class AutoWrapLabel : public QLabel
{
Q_OBJECT
public:
AutoWrapLabel(QWidget *parent = nullptr);
AutoWrapLabel(const QString &text, QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
~AutoWrapLabel();
void setText(const QString &qsText);
void setTitleText(const QString &qsText);
virtual void resizeEvent(QResizeEvent *event);
private:
void InitText();
QString CalcText(const QString &qsText);
private:
QString m_qsText;
};
#endif
#include "AutoWrapLabel.h"
#include <QFontMetrics>
AutoWrapLabel::AutoWrapLabel(QWidget *parent)
: QLabel(parent)
{
}
AutoWrapLabel::AutoWrapLabel(const QString &text, QWidget *parent /*= nullptr*/, Qt::WindowFlags f /*= Qt::WindowFlags()*/)
: QLabel(text, parent, f)
{
setText(text);
}
AutoWrapLabel::~AutoWrapLabel()
{
}
void AutoWrapLabel::setText(const QString & qsText)
{
m_qsText = qsText;
InitText();
}
void AutoWrapLabel::setTitleText(const QString &qsText)
{
m_qsText = qsText;
InitText();
}
void AutoWrapLabel::resizeEvent(QResizeEvent *event)
{
QLabel::resizeEvent(event);
InitText();
}
void AutoWrapLabel::InitText()
{
QLabel::setText(CalcText(m_qsText));
}
QString AutoWrapLabel::CalcText(const QString &qsText)
{
QString text;
QString tempText;
int nHight =this->size().height();
int nWidth = this->size().width();
QFontMetrics metrics = this->fontMetrics();
int nFontHight = metrics.height();
int nMargin = this->margin();
//几行
int hightNum = (nHight - 2* nMargin) / nFontHight;
for(int index = 0; index < qsText.size() && hightNum > 0; ++index)
{
if(metrics.width(tempText + qsText.at(index)) > nWidth)
{
text +=tempText;
--hightNum;
if(hightNum > 0)
{
text += "\n";
}
tempText = qsText.at(index);
}
else
{
tempText+= qsText.at(index);
}
}
if (hightNum > 0)
{
text += tempText;
}
return text;
}