支持自动换行的QLabel

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;
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值