问题描述
我正在尝试使用没有空格但用逗号分隔的文本制作多行 QLabel
。
例如:'猫,狗,兔子,火车,汽车,飞机,奶酪,肉,门,窗'
我发现 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_()