2

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

当我将我的文本设置QLabel为更长的文本时,我的主窗口突然变大了,我不知道为什么会发生这种情况。

以下示例代码基本包含:

  • 一个QMainWindow
    • AQWidget作为中心小部件
      • 作为QVBoxLayout那个的孩子
        • LabelBar里面那个。

LabelBar是一个QWidget,它又包含:

  • 一个QHBoxLayout
    • 里面有两个QLabel

一秒钟后,aQTimer将标签设置为更长的文本以说明问题。

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

1 回答 1

3

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

  • 你可以放QLabel一个QScrollArea. 当标签的文本太长时,会出现滚动条。
  • 您可以使用self.lbl2.setWordWrap(True). 只要你设置了一些空格的文本,QLabel它就会分几行显示,并且窗口会垂直增长一点而不是水平增长。
  • 您可以使用 忽略QLabel的尺寸提示self.lbl2.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Fixed)QLabel的内容不会影响其布局或父窗口小部件的大小。太大的文本将被截断。
于 2014-02-12T20:57:50.263 回答