QLabel 和 Word Wrap:如何根据逗号与空格换行

问题描述

我正在尝试使用没有空格但用逗号分隔的文本制作多行 QLabel。 例如:'猫,狗,兔子,火车,汽车,飞机,奶酪,肉,门,窗'

enter image description here

我发现 setWordWrap 可以实现多行,但它会根据空格中断。

如何基于逗号换行?

这是一个代码示例:

from PySide2.QtWidgets import *


class MainWindow(QMainWindow):
    def __init__(self,*args,**kwargs):
        super(MainWindow,self).__init__(*args,**kwargs)
        self.setGeometry(500,100,50,100)

        line = QLabel()
        line.setMaximumWidth(150)
        line.setText('Cat,Dog,Rabbit,Train,Car,Plane,Cheese,Meat,Door,Window')
        line.setWordWrap(True)

        self.setCentralWidget(line)

        self.show()


if __name__ == '__main__':
    app = QApplication([])
    window = MainWindow()
    app.exec_()

解决方法

一种方法是根据 QLabel 大小编辑文本。

以下在每个行大小事件上触发,使其成为一个代价高昂的解决方案。

首先我们添加一个信号:

class MainWindow(QMainWindow):
    resized = QtCore.pyqtSignal()

然后我们将信号与方法连接,将自动换行设置为 False 并添加自定义调整大小事件,该事件在每次标签获得新大小时触发:

self.line.setWordWrap(False)
self.line.resizeEvent = self.on_resize_event
self.resized.connect(self.add_spaces)

on_resize_event 处理大小变化并触发 add_spaces :

def on_resize_event(self,event):
    if not self._flag:
        self._flag = True
        self.resized.emit()
        QtCore.QTimer.singleShot(100,lambda: setattr(self,"_flag",False))
    print(f"Resized line: {self.line.size()}")
    return super(MainWindow,self).resizeEvent(event)

最后,我们有一个 add_spaces 方法,用于计算最大行长度并以逗号分隔。

def add_spaces(self):
    size = self.line.size()
    text = self.mystring
    result_string = ""
    temp_label = QLabel()
    temp_text = ""

    #Split the chunks by delimiter
    chunks = text.split(",")

    for i,chunk in enumerate(chunks):
        temp_text += chunk + ",";
        if len(chunks) > i+1:
            temp_label.setText(temp_text + chunks[i+1] + ",")
            width = temp_label.fontMetrics().boundingRect(temp_label.text()).width()
            if width >= size.width():
                result_string += temp_text + "\n"
                temp_text = ""
        else:
            result_string += temp_text

    self.line.setText(result_string)

完整代码:

from PyQt5 import QtCore
from PyQt5.QtWidgets import QMainWindow,QLabel,QApplication


class MainWindow(QMainWindow):
    resized = QtCore.pyqtSignal()
    def __init__(self,*args,**kwargs):
        super(MainWindow,self).__init__(*args,**kwargs)
        self._flag = False

        self.line = QLabel()
        self.line.setStyleSheet("background-color: grey;color:white;")
        self.line.setMaximumWidth(300)
        self.line.setMinimumWidth(20)

        self.mystring = 'Cat,Dog,Rabbit,Train,Car,Plane,Cheese,Meat,Door,Window,very,long,list of words,word,list of word,list of word'

        self.line.setText(self.mystring)



        self.setCentralWidget(self.line)

        self.line.setWordWrap(False)
        self.line.resizeEvent = self.on_resize_event
        self.resized.connect(self.add_spaces)

        self.show()
        self.add_spaces()


    def on_resize_event(self,event):
        if not self._flag:
            self._flag = True
            self.resized.emit()
            QtCore.QTimer.singleShot(100,False))
        print(f"Resized line: {self.line.size()}")
        return super(MainWindow,self).resizeEvent(event)

    def add_spaces(self):
        size = self.line.size()
        text = self.mystring
        result_string = ""
        temp_label = QLabel()
        temp_text = ""

        #Split the chunks by delimiter
        chunks = text.split(",")

        for i,chunk in enumerate(chunks):
            temp_text += chunk + ",";
            if len(chunks) > i+1:
                temp_label.setText(temp_text + chunks[i+1] + ",")
                width = temp_label.fontMetrics().boundingRect(temp_label.text()).width()
                if width >= size.width():
                    result_string += temp_text + "\n"
                    temp_text = ""
            else:
                result_string += temp_text

        self.line.setText(result_string)




if __name__ == '__main__':
    app = QApplication([])
    window = MainWindow()
    app.exec_()

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...