我希望在一个布局中的QLabel上使用Qt.TextWrapAnywhere功能。
我按照这个指导进行操作,我的代码也与它相同,以提供最小化的代码。
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPainter
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow, QStyleOption, QVBoxLayout, QWidget, QStyle
class SuperQLabel(QLabel):
def __init__(self, *args, **kwargs):
super(SuperQLabel, self).__init__(*args, **kwargs)
self.textalignment = Qt.AlignLeft | Qt.TextWrapAnywhere
self.isTextLabel = True
self.align = None
def paintEvent(self, event):
opt = QStyleOption()
opt.initFrom(self)
painter = QPainter(self)
self.style().drawPrimitive(QStyle.PE_Widget, opt, painter, self)
self.style().drawItemText(painter, self.rect(),
self.textalignment, self.palette(), True, self.text())
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.resize(100, 200)
self.label = QLabel()
self.label.setWordWrap(True)
self.label.setText("11111111111111111111\n2222222211111111")
self.slabel = SuperQLabel()
self.slabel.setMinimumWidth(10)
self.slabel.setText("111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")
self.centralwidget = QWidget()
self.setCentralWidget(self.centralwidget)
self.mainlayout = QVBoxLayout()
self.mainlayout.addWidget(self.label)
self.mainlayout.addWidget(self.slabel)
self.centralwidget.setLayout(self.mainlayout)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
我稍微改了一下这个代码self.slabel.setMinimumWidth(10),否则根据宽度调整标签的大小不起作用。
它完美地根据宽度换行文本。但是问题在于当考虑高度时,self.label = QLabel()普通的QLabel将根据布局自动调整内容的高度。
例如,如果我在文字中添加一个\n,那么QLabel必须显示2行。
但是使用这个新的定制标签,例如self.slabel = SuperQLabel(),只要布局中有足够的空间,换行就很好。我认为我必须使用setminimumHeight(),但不知道如何在自定义换行后获得正确的高度。
heightForWidth()
方法,它只会更新提示,但不能强制维度。换句话说,用户始终可以将标签调整为部分隐藏某些文本的宽度/高度。 - musicamante