QLabel自动换行的实现

刚开始百度了下想找现成的,没想到搜索的结果大部分都是这篇博文
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 = "

%s

"%(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”分片,其次每一个分片都要根据字符宽度累加判断是否换行,所以依次判断每一个分片的长度。最后通过统计换行的次数判断高度。

实现效果图
QLabel自动换行的实现_第1张图片

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

你可能感兴趣的:(PyQt5,PyQt5的学习工作总结,QLabel自动换行)