在QLabel上设置自动换行会破坏窗口的大小约束。

7
我有以下代码:
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_())

它按预期工作,生成一个窗口,无法调整大小为更小:

enter image description here

然而,当我取消注释self.label.setWordWrap(True)这一行时,这些约束似乎消失了。我可以调整窗口大小到更小,完全破坏布局,因为QTextEdit仍保持其尺寸约束:

enter image description here

我尝试使用self.setMinimumSize(self.size())来解决这个问题。对于这个特定的例子,它是有效的,但如果大小更大,例如self.text.setMinimumSize(480, 800),它就会出现问题。即使在创建时,窗口也会变得太小,因此setMinimumSize没有帮助:

enter image description here

有没有办法修复它并使窗口/布局仍然与启用换行的 QTextEdit 的最小大小相匹配?

版本信息:

OS: Windows-7-SP1 (32bit)
Python: 3.4.1
PyQt: 5.3.1
Qt: 5.3.1

2
这个问题在文档中提到。还有一个错误报告 - thuga
@thuga - 哇!谢谢。我没想到会有这个。 - Fenikso
@thuga,缺少错误报告链接,也许是这个:https://bugreports.qt.io/browse/QTBUG-37673。 - ismailsunni
2个回答

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_())

0

我也遇到了这个问题,使用QT 4.8,但由于我正在开发一个QGIS 2.18的插件,它仍在使用QT 4.8,所以我无法升级我的QT。

我的解决方法是在调整大小时操作QWebView(或在您的情况下,您的QTextEdit)的maximumHeight。您需要发出自定义信号以进行调整大小,因为它在QT中不可用(请参见:PyQt:检测小部件窗口调整大小信号

因此,我的代码类似于:

class MetadataConverterDialog(QDialog):
    resized = pyqtSignal()
        # Adapted from https://dev59.com/xlgQ5IYBdhLWcg3wOBOw#43126946
    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 前的小部件)。您需要找到适合您对话框的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接