在QLabel上设置自动换行会打破窗口的大小限制

Fen*_*kso 6 python qt pyqt

我有以下代码:

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_())
Run Code Online (Sandbox Code Playgroud)

它按预期工作,产生一个窗口,不能调整为更小:

在此输入图像描述

但是,当我取消注释该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
Run Code Online (Sandbox Code Playgroud)

Fen*_*kso 6

正如 @thuga 在评论中建议的那样,该问题在文档中提到并已报告,显然具有“不会/无法修复”的解决方案。

我在这里找到了针对此特定问题的解决方法的提示。它适用于我的示例和我的应用程序: 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_())
Run Code Online (Sandbox Code Playgroud)