QLabel自动换行的实现

来源:互联网 发布:女性生殖健康 知乎 编辑:程序博客网 时间:2024/04/30 10:52

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

0 0
原创粉丝点击