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
Содержание не повлияет на его макет или размер родительского виджета. Слишком большой текст будет обрезан.