Qt: HBoxLayout - остановить изменение размера MainWindow до содержимого

Кажется, что большинство людей спрашивают, как изменить размер их QMainWindow в соответствии с его содержимым - у меня противоположная проблема, мое главное окно изменяется, и я не знаю, почему.

Когда я устанавливаю свой QLabel на более длинный текст, мое главное окно внезапно становится больше, и я не могу понять, почему это происходит.

Следующий пример кода в основном содержит:

  • A QMainWindow
    • A QWidget as central widget
      • A QVBoxLayout as a child of that
        • A LabelBar inside that.

LabelBar — это QWidget, который, в свою очередь, содержит:

  • A QHBoxLayout
    • Two QLabels in that.

Через секунду 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_()

person The Compiler    schedule 12.02.2014    source источник


Ответы (1)


Главное окно увеличивается, потому что это цель использования макетов. Макеты предъявляют требования к размеру своих виджетов, чтобы гарантировать правильное отображение всего содержимого. Требования зависят от дочерних виджетов. Например, QLabel по умолчанию растет горизонтально и требует места для размещения своего содержимого. Есть много способов предотвратить рост окна, и результирующее поведение варьируется:

  • Вы можете поместить QLabel в QScrollArea. Если текст метки слишком длинный, появятся полосы прокрутки.
  • Вы можете включить перенос слов, используя self.lbl2.setWordWrap(True). Пока вы устанавливаете текст с некоторыми пробелами, QLabel будет отображать его в несколько строк, а окно будет немного увеличиваться по вертикали, а не по горизонтали.
  • Вы можете игнорировать подсказку размера QLabel, используя self.lbl2.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Fixed). Содержимое QLabel не повлияет на его макет или размер родительского виджета. Слишком большой текст будет обрезан.
person Pavel Strakhov    schedule 12.02.2014
comment
Номер 3 был хорошей подсказкой - я все еще хотел, чтобы размер метки изменялся, когда есть место (например, когда другая метка становится меньше). В итоге я установил для параметра sizePolicy моего LabelBar игнорирование, что сделало то, что я хотел. - person The Compiler; 13.02.2014