話不多說,人生苦短,我用Python ,人生苦短,我用Qt,效果如下:
看到網上好多方法說去自適應輸入內容,然後換行顯示的,諸如以下:
方案1:
試了後沒什麼大的效果,達不到想要的。
l_talk = QtGui.QLabel()
l_talk.setWordWrap(True)
l_talk.setAlignment(QtCore.Qt.AlignTop)
l_talk.adjustSize()
l_talk.setScaledContents(True)
方案2:
l_talk = QtGui.QLabel()
sizePolicy = QSizePolicy()
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(l_talk.sizePolicy().hasHeightForWidth())
l_talk.setSizePolicy(sizePolicy)
都不中啊!!!還是要自己動手!
根據\n去拆分,然後分別針對每行文字去逐個字符用QFontMetrics來統計長度,找到夠一行顯示的長度後,記錄index,然後截取,追加換行符\n,接着用截取剩下的字串,再按上面的方式找index。。。
from PyQt4.QtGui import QFontMetrics, QFont
item = QtGui.QListWidgetItem() # 創建QListWidgetItem對象
# 根據談話的長度,去適配item的高度
lines = 0 # 多少行
talkWidth = 420 # 對話框的寬度
lineHight = 30 # 每行的高度 30
splitTalk = talk.split('\n') # 先以換行符去拆分對話
refinedTalk = '' # 分段處理後的對話
fm = QFontMetrics(QFont("Roman times", 14))
for index in range(len(splitTalk)):
s = splitTalk[index]
# 判斷每行的長度再去拆分,如果太長,就要相應截斷添加 換行符
if fm.width(s) > talkWidth:
# Log.i(TAG, "超長,需要截斷。。。")
wordIndex = -1
cutStr = s[wordIndex + 1:]
for cutLine in range(int(fm.width(s) / talkWidth) + (0 if fm.width(s) % talkWidth == 0 else 1)):
lines += 1
lenWords = 0
# 就要拆分,然後添加換行符
for wIndex in range(len(cutStr)):# 遍歷每個字符,去統計長度
word = cutStr[wIndex]
# Log.i(TAG, "wIndex = %d ,word = %s" % (wIndex, word))
lenWords += fm.width(word)
if lenWords >= talkWidth:
wordIndex = wIndex
break
# Log.i(TAG, "截到 %d 位置,夠一行了,開始添加換行符,得到字串:%s" % (wordIndex, cutStr[:wordIndex + 1]))
refinedTalk += (cutStr[:wordIndex + 1] + ('\n' if index <= len(splitTalk) - 1 else ''))
# 然後一直以遍歷剩下的部分去判斷,截取
cutStr = cutStr[wordIndex + 1:]
else:
lines += 1
refinedTalk += (s + ('\n' if index < len(splitTalk) - 1 else ''))
item.setSizeHint(QtCore.QSize(490, lines * lineHight + 30)) # 設置QListWidgetItem大小
l_talk = QtGui.QLabel(refinedTalk)
l_talk.setFont(QFont("Roman times", 14)) # 這裏的字體要與上面Metrics量的字體一致
l_talk.setGeometry(QtCore.QRect(0, 0, talkWidth, lines * lineHight))
l_talk.setAlignment(QtCore.Qt.AlignTop)
l_talk.adjustSize()
l_talk.setScaledContents(True)