QLabel自动换行的实现

本文介绍了如何实现QLabel的自动换行功能。通过利用ASCII和中文字符的等宽特性,设定600px的换行宽度,将文本按换行符分片并逐个判断字符宽度,达到换行效果。尽管代码不全,但思路清晰。作者期待更好的解决方案,并考虑使用qml重新实现。

刚开始百度了下想找现成的,没想到搜索的结果大部分都是这篇博文
1. 让QLabel自适应text的大小,直接用下面的代码:
LabelName->adjustSize();
2. 让QLabel能够自动判断并换行显示:
LabelName->setGeometry(QRect(328, 240, 329, 27*4)); //四倍行距
LabelName->setWordWrap(true);
LabelName->setAlignment(Qt::AlignTop);
这种方法如果全是ASCII字符并超过一行,则不会换行!
╮(╯▽╰)╭只能自己动手了

# 下面的代码实现了聊天气泡大小自适应于内容,解决了中文与ASCII字符大小不同以及ASCII字符过长
# 不自动换行的问题
height = 0
width = 0
height = 56
checkLengthOver = 0
chineseExistFlag = 0
textSlice = sendText.split("\n")
sendTextList = list()

for s in textSlice:
    tmpText = ""
    tmpNum = 0
    tmpWidth = 0
    tmpNumList = list()
    tmpNumList.append(0)
    status = 0
    if not s:
        height += 16
    for i in s:
        if ord(i) in range(257):
            tmpWidth += 600 / 73
            tmpNum += 1
            if not status:
                status = 1
                height += 16
        else:
            tmpWidth += 600 / 44
            tmpNum += 1
            if not status:
                status = 1
                height += 16.3
            chineseExistFlag = 1

        if tmpWidth > 600 - 600 / 44:
            tmpNumList.append(tmpNum)
            checkLengthOver = 1
            tmpWidth = 0
            if chineseExistFlag:
                chineseExistFlag = 0
                height += 16.3
            else:
                height += 16

        if tmpWidth > width:
            width = tmpWidth
        if checkLengthOver == 1:
            width = 600

    for j in range(len(tmpNumList)-1):
        tmpText = tmpText + s[tmpNumList[j]:tmpNumList[j+1]] + "\n"
    tmpText = tmpText + s[tmpNumList[-1]:]
    sendTextList.append(tmpText)
sendText = "\n".join(sendTextList)
            # sendText = "<p style=\"line-height:%d\">%s</p>"%(90, sendText)

        if width == 0:
            width = 70
        else:
            width += 80

        itemHeight = height + 100

        self.item.lbSendText.setMinimumSize(QtCore.QSize(width, height))
        self.item.lbSendText.setMaximumSize(QtCore.QSize(width, height))
        self.item.lbSendText.setWordWrap(True)
        self.item.lbSendText.setText(sendText)
        self.item.lbSendText.adjustSize()
        self.item.lbSendText.setScaledContents(True)

代码不太全,有些参数定义没去找了,但细心推导还是能推出来的。

具体代码就不细说了,大体思路说下:
这里使用的是文泉驿等宽11号字体,ASCII字符是等宽的,中文之间是等宽的,但他们之间不等宽所以要分开计算。
这里设定的换行宽度是600px
首先将要发送的文字按照换行符”\n”分片,其次每一个分片都要根据字符宽度累加判断是否换行,所以依次判断每一个分片的长度。最后通过统计换行的次数判断高度。

实现效果图
效果图

苦思很久,也没想出更好的办法了,若有高人路过,还望指点指点,感激不尽!另外,在此之后可能会尝试推倒重来,用qml写。老铁,扎心没:)

评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值