Сначала вы должны понять следующее:
Имейте в виду, что следующее выражение:
lay = FooLayout()
some_widget.setWidget(lay)
эквивалентно:
lay = FooLayout(some_widget)
И то, и другое указывают, что макет будет обрабатывать геометрию дочерних элементов.
С другой стороны, если виджет уже имеет макет, никакой другой макет не может быть установлен, пока предыдущий макет не будет удален.
Так что в вашем случае работает только первая инструкцияа не следующие 2, поэтому сетка макета будет исключена, а представление списка будет поддерживаться только потому, что оно является дочерним для виджета.
gridParameter = QGridLayout(self)
# ...
grid = QGridLayout(self)
# ...
self.setLayout(grid)
В моем случае я избегаю размещения родителей виджетов, чтобы увидеть,Существует проблема, а также я устанавливаю в качестве родителя макета только при необходимости:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class MainWindow(QtWidgets.QWidget):
def __init__(self):
super(MainWindow, self).__init__()
list1 = QtWidgets.QListView()
gridParameter = QtWidgets.QGridLayout()
idxRow = 0
label_1 = QtWidgets.QLabel("I am label one")
gridParameter.addWidget(label_1, idxRow, 0)
idxRow = 1
label_2 = QtWidgets.QLabel("I am label two")
gridParameter.addWidget(label_2, idxRow, 1)
grid = QtWidgets.QGridLayout(self) # <--- principal layout
grid.addLayout(gridParameter, 0, 0)
grid.setSpacing(2)
grid.addWidget(list1)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
sys.exit(app.exec_())
В заключение используйте self
при необходимости.