PyQt5. Как настроить layout, чтобы виджеты сразу вставали вначале, а не в центре формы?
В общем у меня сейчас форма выглядит так, но нужно, чтобы эти виджеты были вначале формы.

Пытался подвинуть виджеты с помощью большого виджета, но в коде получается несуразица

Вопрос: Есть ли какая то настройка, чтобы оно сразу добавлялось в начало формы?
Вот код, который частично решает проблему с помощью дополнительного виджета.
import sys
from PyQt5.QtCore import QObject, QRect
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QAction, qApp, QPushButton, QLineEdit, QGridLayout, QDockWidget, QListWidget, QSpacerItem, QSizePolicy
from PyQt5.QtGui import QIcon
class GUI(QWidget):
#Problem Widgets
Widgets = [0]
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
#grid layout
self.widget = QWidget(self)
self.ProblemLayout = QGridLayout(self.widget)
self.widget.setGeometry(QRect(10, 80, 390, 950))
#Buttons
btnAdd = QPushButton('Add', self)
btnAdd.resize(60, 40)
btnAdd.move(10, 30)
btnAdd.clicked.connect(self.AddProblem)
#Window
self.setGeometry(500, 150, 1000, 800)
self.setWindowTitle('Planner')
#self.setWindowIcon(QIcon('images/icon/icon.png'))
self.show()
def UpdateProblem(self):
del GUI.Widgets[-2]
self.widget.hide()
for i in reversed(range(self.ProblemLayout.count())):
widgetToRemove = self.ProblemLayout.itemAt(i).widget()
# remove it from the layout list
self.ProblemLayout.removeWidget(widgetToRemove)
# remove it from the gui
widgetToRemove.setParent(None)
widget = QListWidget(self)
GUI.Widgets.append(widget)
for i in range(len(GUI.Widgets)-1):
for j in range(len(GUI.Widgets[i])):
self.ProblemLayout.addWidget(GUI.Widgets[i][j], i, j)
self.ProblemLayout.addWidget(GUI.Widgets[-1], len(GUI.Widgets), 1)
self.widget.show()
def AddProblem(self):
self.lineEditP = QLineEdit(self)
self.btnP = QPushButton('More', self)
GUI.Widgets.append([self.lineEditP, self.btnP])
self.UpdateProblem()
if __name__ == '__main__':
app = QApplication(sys.argv)
gui = GUI()
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Попробуйте так:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>718</width>
<height>422</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>PushButton</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_2">
<property name="text">
<string>PushButton</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_3">
<property name="text">
<string>PushButton</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="1">
<widget class="QLineEdit" name="lineEdit"/>
</item>
<item row="0" column="3">
<widget class="QPushButton" name="pushButton_4">
<property name="text">
<string>PushButton</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QSpinBox" name="spinBox"/>
</item>
<item row="0" column="4">
<widget class="QPushButton" name="pushButton_5">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="checkBox">
<property name="text">
<string>CheckBox</string>
</property>
</widget>
</item>
<item row="1" column="1">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>718</width>
<height>21</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
Update
Действительно, подошло. Но, теперь другая проблема. Я делаю это не через designer, и у меня возникает ошибка при добавлении этого элемента: addWidget(self, QWidget): argument 1 has unexpected type 'QSpacerItem'
Я не совсем понимаю вашу идею, но попробуйте пример ниже:
import sys
from PyQt5.QtCore import QObject, QRect, Qt
from PyQt5.QtWidgets import (QApplication, QWidget, QMainWindow, QAction,
qApp, QPushButton, QLineEdit, QGridLayout, QDockWidget, QListWidget,
QSpacerItem, QSizePolicy)
from PyQt5.QtGui import QIcon
class GUI(QWidget):
def __init__(self):
super().__init__()
self.i = 0
self.initUI()
def initUI(self):
btnAdd = QPushButton('Add')
btnAdd.clicked.connect(self.addProblem)
#grid layout
self.layout = QGridLayout(self)
self.layout.addWidget(btnAdd, self.i, 0, alignment=Qt.AlignLeft )
self.layout.setRowStretch(111, 1)
self.i += 1
def addProblem(self):
lineEdit = QLineEdit()
btn = QPushButton(f'More {self.i}')
self.layout.addWidget(lineEdit, self.i, 0)
btn.clicked.connect(lambda ch, l=lineEdit: print(l.text()))
self.layout.addWidget(btn, self.i, 1)
self.i += 1
if __name__ == '__main__':
app = QApplication(sys.argv)
gui = GUI()
gui.setWindowTitle('Planner')
gui.resize(300, 400)
gui.show()
sys.exit(app.exec_())

