【问题标题】:Setting word wrap on QLabel breaks size constrains for the window在 QLabel 上设置自动换行会破坏窗口的大小限制
【发布时间】: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

【问题讨论】:

标签: python qt pyqt


【解决方案1】:

正如@thuga 在评论中所建议的那样,docsreported 已经提到了这个问题,显然是“不会/无法修复”的解决方案。

我找到了解决此特定问题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 插件。

    当调整大小发生时,我的工作是操纵QWebViewmaximumHeight(或者在你的情况下,你的QTextEdit)。您需要发出自定义信号以调整大小,因为它在 QT 中不可用(请参阅:PyQt: Detect resizing in Widget-window resized signal

    所以,我的代码是这样的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-29
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      • 2019-08-03
      相关资源
      最近更新 更多