我想要创建一个窗口,该窗口的高度应该等于子QLabel的高度,QLabel可以设置为任意大小的文本,setWrap为True。以下是我的当前代码:
class TextWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setFixedWidth(230)
self.centralwidget = QWidget(self)
self.centralwidget.setObjectName("centralwidget")
self.horizontalLayout = QHBoxLayout(self.centralwidget)
self.horizontalLayout.setSizeConstraint(QLayout.SizeConstraint.SetMinimumSize)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setSpacing(0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.label = QLabel(self.centralwidget)
self.label.setWordWrap(True)
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
self.setCentralWidget(self.centralwidget)
self.label.setText("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur non urna nisl. Integer venenatis aliquet faucibus. Nam tristique massa a vestibulum congue. Vivamus nisi felis, volutpat vitae neque quis, pharetra tristique massa. Duis tincidunt et nulla a hendrerit. Vestibulum in molestie lectus.")实际行为:


如果有大量的文本,文本就会被切断,如果没有足够的文本,那么窗口的边缘和文本之间就会有巨大的边距,我想要窗口的高度来包装文本,也就是说,窗口的高度需要与文本的大小相等。这是如何做到的呢?
发布于 2022-11-04 01:47:12
布局文档的布局问题部分解释了这一点:
在标签小部件中使用富文本可能会给其父小部件的布局带来一些问题。当标签被文字包装时,Qt的布局管理器处理富文本的方式会出现问题“。
注意,作为经验法则,您绝不能依赖使用文字包装文本的标签的大小提示。这与文本布局中存在的许多问题有关,如意想不到的字体行为、系统字体缩放、高DPI设置等。实际上,默认行为不考虑可能的字包装标签的大小提示,这是一个好的问题,否则可能会出现严重的性能问题,特别是在调整大小时。
事实是,文字包装的文本应该始终显示在滚动区域(使用QTextEdit或放置在QScrollArea中的QLabel );默认的API无法知道可以显示某些文本的无限可能性,并且应该始终以最佳性能为目标。
造成这个问题的原因是这样一个事实,即无法知道标签的“最佳”大小提示可以包装其内容,而且布局管理器应该尽可能快地响应,否则就会冒递归或不必要的开销的风险,即使是简单的标签。
如果完全确定标签的固定宽度,则应该显式地设置它:
self.label.setFixedWidth(230)如果由于布局中存在其他可能更改标签可用宽度的小部件,因此无法事先知道宽度,则可以依赖QLabel heightForWidth(),根据当前宽度为其设置最小高度,最后对主窗口的adjustSize()进行延迟调用(需要延迟以允许整个布局管理更新大小提示)。
from random import randrange
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
def randomText():
return ' '.join(['Lorem ipsum'] * randrange(10, 50)) + '\n\nThe end.'
class TextWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setFixedWidth(230)
central = QWidget()
layout = QGridLayout(central)
layout.addWidget(QToolButton())
self.label = QLabel(randomText())
self.label.setWordWrap(True)
layout.addWidget(self.label, 0, 1)
layout.addWidget(QPushButton('Hello'), 1, 0, 1, 2)
self.setCentralWidget(central)
def setMessage(self, message=''):
self.label.setText(message or randomText())
self.updateSize()
def updateSize(self):
self.centralWidget().layout().activate()
self.label.setMinimumHeight(0)
self.label.setMinimumHeight(
self.label.heightForWidth(self.label.width()))
QTimer.singleShot(0, self.adjustSize)
def resizeEvent(self, event):
super().resizeEvent(event)
self.updateSize()
app = QApplication([])
w = TextWindow()
QTimer.singleShot(1000, w.setMessage)
w.show()
app.exec()发布于 2022-11-04 01:43:48
使用QLabel方法获取sizeHint()的大小提示,然后在调整窗口大小时使用结果。
例如:
text = "Some very long text that will possible need to be wrapped and take up more than one line."
value = 3 # <--- raise or lower value to see adjustments
class Window(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent=parent)
self.central = QWidget()
self.layout = QVBoxLayout(self.central)
self.setCentralWidget(self.central)
self.label = QLabel(text=text * value)
self.layout.addWidget(self.label)
self.label.setWordWrap(True)
self.resize(self.label.sizeHint())https://stackoverflow.com/questions/74311198
复制相似问题