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

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

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

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

  • QMainWindow
    • QWidget как центральный виджет
      • QVBoxLayout как ребенок этого
        • LabelBar внутри этого.

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

  • 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 ответ

Решение

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

  • Вы можете положить QLabel в QScrollArea, Когда текст метки слишком длинный, появятся полосы прокрутки.
  • Вы можете включить перенос слов, используя self.lbl2.setWordWrap(True), Пока вы устанавливаете текст с некоторыми пробелами, QLabel отобразит его в несколько строк, и окно будет немного расти вертикально, а не горизонтально.
  • Вы можете игнорировать QLabelразмер подсказки self.lbl2.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Fixed), QLabelСодержание не повлияет на его макет или размер родительского виджета. Слишком большой текст будет обрезан.
Другие вопросы по тегам