在 QLabel 上设置自动换行会破坏窗口的大小限制
Posted
技术标签:
【中文标题】在 QLabel 上设置自动换行会破坏窗口的大小限制【英文标题】:Setting word wrap on QLabel breaks size constrains for the window 【发布时间】:2014-09-03 12:13:40 【问题描述】:我有以下代码:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
TEXT = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " \
"Nullam malesuada tellus in ex elementum, vitae rutrum enim vestibulum."
#==============================================================================
class Window(QWidget):
def __init__(self, *args, **kwargs):
QWidget.__init__(self, *args, **kwargs)
# Widgets
self.label = QLabel(TEXT, self)
# self.label.setWordWrap(True)
self.text = QTextEdit(self)
self.text.setMinimumSize(480, 320)
self.text.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
# Layout
self.layout = QGridLayout()
self.layout.addWidget(self.label, 0, 0)
self.layout.addWidget(self.text, 1, 0)
self.layout.setContentsMargins(5, 5, 5, 5)
self.layout.setSpacing(5)
self.setLayout(self.layout)
self.adjustSize()
self.show()
#==============================================================================
if __name__ == "__main__":
app = QApplication(sys.argv)
win = Window()
sys.exit(app.exec_())
它按预期工作,产生一个窗口,不能将其调整为更小:
但是,当我取消注释 self.label.setWordWrap(True)
行时,这些约束似乎消失了。我可以将窗口调整为更小,完全破坏布局,因为QTextEdit
仍然保留其大小约束:
我尝试使用self.setMinimumSize(self.size())
解决此问题。这适用于这个特定的示例,但是如果大小更大,例如self.text.setMinimumSize(480, 800)
,则会中断。即使在创建窗口时,这也会导致窗口太小,因此 setMinimumSize
无济于事:
有没有办法修复它并使窗口/布局仍然匹配QTextEdit
的最小大小,即使启用了自动换行?
版本信息:
OS: Windows-7-SP1 (32bit)
Python: 3.4.1
PyQt: 5.3.1
Qt: 5.3.1
【问题讨论】:
docs 中提到了这个问题。还有一个bug report。 @thuga - 哇!谢谢。我没想到会这样。 @thuga 错误报告链接丢失,可能是这个:bugreports.qt.io/browse/QTBUG-37673 【参考方案1】:正如@thuga 在评论中所建议的那样,docs 和reported 已经提到了这个问题,显然是“不会/无法修复”的解决方案。
我找到了解决此特定问题here 的提示。它适用于我的示例以及我的应用程序:
self.setMinimumSize(self.sizeHint())
.
代码如下所示:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
TEXT = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " \
"Nullam malesuada tellus in ex elementum, vitae rutrum enim vestibulum."
#==============================================================================
class Window(QWidget):
def __init__(self, *args, **kwargs):
QWidget.__init__(self, *args, **kwargs)
# Widgets
self.label = QLabel(TEXT, self)
self.label.setWordWrap(True)
self.text = QTextEdit(self)
self.text.setMinimumSize(480, 800)
self.text.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
# Layout
self.layout = QGridLayout()
self.layout.addWidget(self.label, 0, 0)
self.layout.addWidget(self.text, 1, 0)
self.layout.setContentsMargins(5, 5, 5, 5)
self.layout.setSpacing(5)
self.setLayout(self.layout)
self.setMinimumSize(self.sizeHint())
self.show()
#==============================================================================
if __name__ == "__main__":
app = QApplication(sys.argv)
win = Window()
sys.exit(app.exec_())
【讨论】:
【参考方案2】:我也遇到了这个问题,使用 QT 4.8,我无法升级我的 QT,因为我正在开发一个仍然使用 QT 4.8 的 QGIS 2.18 插件。
当调整大小发生时,我的工作是操纵QWebView
的maximumHeight
(或者在你的情况下,你的QTextEdit
)。您需要发出自定义信号以调整大小,因为它在 QT 中不可用(请参阅:PyQt: Detect resizing in Widget-window resized signal)
所以,我的代码是这样的:
class MetadataConverterDialog(QDialog):
resized = pyqtSignal()
# Adapted from https://***.com/a/43126946/1198772
def resizeEvent(self, event):
"""Emit custom signal when the window is re-sized.
:param event: The re-sized event.
:type event: QResizeEvent
"""
self.resized.emit()
return super(MetadataConverterDialog, self).resizeEvent(event)
def after_resize(self):
"""Method after resizing the window."""
max_height = self.height() - 275 # Magic number, to make it pretty
self.metadata_preview_web_view.setMaximumHeight(max_height)
275 是我需要保留的值才能正确显示对话框(对于 QWebView 之前的小部件。您需要找到适合您的对话框的值。
【讨论】:
以上是关于在 QLabel 上设置自动换行会破坏窗口的大小限制的主要内容,如果未能解决你的问题,请参考以下文章
Qt图片自适应窗口控件大小(使用setScaledContents)