据说QLabel设置setWordWrap(true)在有足够的高度的时候可以自动换行,但我试了一下不行,不懂是哪里的问题。
这里自己实现一个。
通过重写QTextEdit,根据输入的字符串的长度来自动调整高度,QTextEdit是会自动换行的,所以只需计算出高度即可。
下面看实现代码:
头文件:
#ifndef TEXTITEM_H
#define TEXTITEM_H
#include <QTextEdit>
class TextItem : public QTextEdit
{
Q_OBJECT
public:
explicit TextItem(QWidget *parent = nullptr);
void setItemText(const QString &text);
private:
QString m_text;
int m_nMaxWidth;
int m_nMinWidget;
QFont m_ft;
};
#endif // TEXTITEM_H
cpp文件:
#include "textitem.h"
#include <QDebug>
TextItem::TextItem(QWidget *parent):
QTextEdit(parent),m_nMaxWidth(200), m_nMinWidget(100)
{
//可以设置样式为自己想要的
this->setStyleSheet("background:red;border:none;text-align:center;");
this->setReadOnly(true);
m_ft.setPixelSize(18);
this->setFont(m_ft);
}
void TextItem::setItemText(const QString &text)
{
m_text = text;
//计算文字长度
QFontMetrics fontMetrics(m_ft);
int textWidth = fontMetrics.width(m_text);
qDebug() << __FUNCTION__ << "song" << textWidth;
//根据文字大小与设定的最大最小值对比来调整长度和高度
if(textWidth > m_nMaxWidth)
{
//获取行数
int lineNum = textWidth/m_nMaxWidth;
this->resize(m_nMaxWidth, 30 + lineNum*21);
}
else
{
this->resize(textWidth + 10, 30);//控件长度需比文字长度要长,这里进行加10
}
this->setText(m_text);
}
直接看代码就懂了。这里会设定一个宽度的最大,大于最大值则需换行,小于则使用字体的长度进行显示
下面看自动换行的效果