Qt:HBoxLayout - 停止MainWindow调整内容大小

时间:2014-02-12 20:41:11

标签: qt resize qmainwindow qlayout qsizepolicy

似乎大多数人都在问如何让他们的QMainWindow调整其内容 - 我有相反的问题,我的MainWindow 调整大小,我不知道为什么。

当我将QLabel设置为较长的​​文本时,我的主窗口突然变大,我无法找到原因。

以下示例代码基本上包含:

  • A QMainWindow
    • QWidget为中心窗口小部件
      • 作为孩子的QVBoxLayout
        • 里面有LabelBar

LabelBarQWidget,后者又包含:

  • A QHBoxLayout
    • 其中两个QLabel

一秒后,QTimer将标签设置为较长的​​文字以证明问题。

PyQt示例代码:

from PyQt5.QtWidgets import (QApplication, QHBoxLayout, QLabel, QWidget,
                             QMainWindow, QVBoxLayout, QSizePolicy)
from PyQt5.QtCore import QTimer

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        cwidget = QWidget(self)
        self.setCentralWidget(cwidget)
        self.resize(100, 100)

        vbox = QVBoxLayout(cwidget)
        vbox.addWidget(QWidget())
        self.bar = LabelBar(self)
        vbox.addWidget(self.bar)

        timer = QTimer(self)
        timer.timeout.connect(lambda: self.bar.lbl2.setText("a" * 100))
        timer.start(1000)

class LabelBar(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        hbox = QHBoxLayout(self)
        self.lbl1 = QLabel(text="eggs")
        hbox.addWidget(self.lbl1)
        self.lbl2 = QLabel(text="spam")
        hbox.addWidget(self.lbl2)

if __name__ == '__main__':
    app = QApplication([])
    main = MainWindow()
    main.show()
    app.exec_()

1 个答案:

答案 0 :(得分:3)

主窗口增长,因为它是使用布局的目标。布局对其小部件的大小要求,以确保正确显示所有内容。要求取决于子小部件。例如,QLabel默认情况下水平增长,并且需要空间来适应其内容。有许多方法可以防止窗口增长,并且产生的行为会有所不同:

  • 您可以将QLabel放入QScrollArea。当标签的文字太长时,会出现滚动条。
  • 您可以使用self.lbl2.setWordWrap(True)启用自动换行。只要您使用一些空格设置文本,QLabel将以多行显示,窗口将垂直增长而不是水平增长。
  • 您可以使用QLabel忽略self.lbl2.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Fixed)的尺寸提示。 QLabel的内容不会影响其布局或父窗口小部件大小。太大的文本将被截断。