Перед тем, как показать решение, вы должны объяснить несколько вещей:
Существует 3 способа установки макета в виджете:
Создайте виджет без родителя, а затем виджет указывает, что он использует этот макет с setLayout()
:
lay = QVBoxLayout()
foo_widget.setLayout(lay)
Укажите, каким виджетом управлять при создании макета.
lay = QVBoxLayout(foo_widget)
Предыдущие методы эквивалентны, но третий способ заключается в том, чтобы установить его в качестве сына уже установленного макета.
Виджет может иметь макет только в качестве верхнего уровня, поэтому, если останется только последний:
lay1 = QVBoxLayout(foo_widget)
lay2 = QVBoxLayout(foo_widget)
# The above is equivalent to:
lay1 = QVBoxLayout()
lay2 = QVBoxLayout(foo_widget)
Виджет является сыном другого виджета, когда онустанавливается как родительский элемент в конструкторе или как часть макета, который обрабатывает положение виджета:
1.
child_1 = Foo_Widget(some_widget)
2.
lay = Foo_Layout(some_widget)
child_2 = Foo_Widget()
lay.addWidget(child_2)
Поэтому, если учесть вышеизложенное, вы можете уменьшить свой код:
...
def initText(self):
self.welcome = QLabel("Welcome to Name!")
self.info = QLabel("This program allows you to....")
self.message = QLabel("First, you must enter some data...", self)
self.proceed = QLabel("Click on 'Next >>' to proceed.", self)
def organize(self):
vbox = QVBoxLayout(self)
scroll = QScrollArea()
vbox.addWidget(scroll)
wid = QWidget(self)
vevobox = QVBoxLayout(wid)
vv = QVBoxLayout()
vv.addWidget(self.welcome)
vv.addWidget(self.info)
vevobox.addLayout(vv)
self.show()
UsВ соответствии с вышесказанным можно собрать следующее дерево:
welcomeWidget
├── message
├── proceed
├── vbox (QVBoxLayout)
│ └── scroll
└── wid
└── vevobox (QVBoxLayout)
└──vv (QVBoxLayout)
├── info
└── welcome
И, как вы видите, это то, что ожидается, например, есть 2 метки, которые отображаются за всем, так как они были впервые созданы без макета, затембыл создан макет, в котором был размещен QScrollArea
, поэтому этот последний занял все доступное пространство, и, наконец, виджет виджета без макета был размещен так, что он будет в верхнем левом положении, а внутри этого виджета оставшиеся 2 меткибыли созданы.
Идея состоит в том, чтобы иметь следующую структуру:
welcomeWidget
└── vbox (QVBoxLayout)
└── scroll
└── wid
└── vv (QVBoxLayout)
├── info
├── message
├── proceed
└── welcome
Используя вышеизложенное, вы получите следующее:
class welcomeWidget(QWidget):
def __init__(self):
super().__init__()
self.initText()
self.organize()
def initText(self):
self.welcome = QLabel("Welcome to Name!")
self.info = QLabel("This program allows you to....")
self.message = QLabel("First, you must enter some data...")
self.proceed = QLabel("Click on 'Next >>' to proceed.")
def organize(self):
vbox = QVBoxLayout(self)
scroll = QScrollArea()
scroll.setWidgetResizable(True)
wid = QWidget()
scroll.setWidget(wid)
vv = QVBoxLayout(wid)
vv.addWidget(self.welcome)
vv.addWidget(self.info)
vv.addWidget(self.message)
vv.addWidget(self.proceed)
vv.addStretch()
vbox.addWidget(scroll)
self.show()