How To Insert Widget To The Layout Counting From The End
GOAL
To insert widget to the layout counting from the end. For example, I’d like to create the add button to add widget at the second position from the end as below.
Environment
Windows 10
Python 3.8.7
PySide2 5.15.2
Method
At first, generate widget and set layout. I created a simple window as below.
import sys from PySide2.QtWidgets import * class MyMainWindow(QMainWindow): def __init__(self, parent=None): super(MyMainWindow, self).__init__(parent) self.id_num = 1 self._generateUI() def _generateUI(self): main_widget = QWidget() self.main_layout = QVBoxLayout() main_widget.setLayout(self.main_layout) self.setCentralWidget(main_widget) button = QPushButton("button" + str(self.id_num)) self.main_layout.addWidget(button) add_button = QPushButton("+") add_button.clicked.connect(self._addItem) self.main_layout.addWidget(add_button) def _addItem(self): # put functions to insert widget here def launch(): app = QApplication.instance() if not app: app = QApplication(sys.argv) widget = MyMainWindow() widget.show() app.exec_() launch()
How to insert widget
Use insertWidget() to insert widget to the layout. This is an wxample of inserting at the second space from the top of the layout. If you’d like to insert widgets the top of the layout, the argument index should be 0.
def _addItem(self): self.id_num += 1 button = QPushButton("button" + str(self.id_num)) self.main_layout.insertWidget(1, button)
The first argument of insertWidget() “index” can’t be set from the end of the layout.
Inserts widget at position index, with stretch factor stretch and alignment alignment. If index is negative, the widget is added at the end.
from Qt Documentation
How to get index from the end
If you’d like to insert item at the n-th position from the end, you should set index (number of widgets – n)
Use count() to get the number of widget. So rewrite insertWidget() as below.
def _addItem(self): self.id_num += 1 button = QPushButton("button" + str(self.id_num)) self.main_layout.insertWidget(self.main_layout.count()-1, button)
The result is the following.