刚开始百度了下想找现成的,没想到搜索的结果大部分都是这篇博文
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写。老铁,扎心没:)

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





