PyQt——QLable自適應換行顯示(仿對話聊天)

話不多說,人生苦短,我用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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章