Qt QLabel换行

过长的字符不换行,一个中文等于两个字符长。

 

1.纯字符换行,计算最大长度有多少个字符,text插入换行符

QString SuwellMessageBox::AutoFeed(QString text, int width) //text仅允许半角
{
    QString strText = text;
    QString str ;
    int count=0; //每行字符个数
    while(TextLabel->fontMetrics().boundingRect(str).width()<width)
    {
        str.append(text[count++]);
    }
    int AntoIndex = 1;  //半角宽度
    if(!strText.isEmpty())
    {
        for(int i = 1;i<strText.size() + 1;i++)
        {
            if(i == (count-1)*AntoIndex + AntoIndex -1)
            {
                strText.insert(i,"\n");
                AntoIndex ++;
            }
        }
    }
    return strText;
}

 

2. 中英文混合输入换行,计算每个字符长度,逐个添加

QFontMetrics font(TextLabel->font());
TextLabel->setText(SpliteText(font, text, maxW_Label));



QString SuwellMessageBox::SpliteText(const QFontMetrics& font, const QString& text, int nLabelSize)
{
    int nTextSize = font.width(text);
    if(nTextSize > nLabelSize){
        int nPos = 0;
        long nOffset = 0;
        for (int i = 0; i < text.size(); i++){
            nOffset += font.width(text.at(i));
            if(nOffset >= nLabelSize){
                nPos = i;
                break;
            }
        }

        nPos = (nPos -1 < 0) ? 0 : nPos -1;//zr.主要是为了防止截取字符串的位置是-1.回退一个字节的作用是换行,防止字符有一半显示一半未显示

        QString qstrLeftData = text.left(nPos);
        QString qstrMidData = text.mid(nPos);
        return qstrLeftData + "\n" + SpliteText(font, qstrMidData, nLabelSize);
    }
    return text;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值