QGridLayout не растягивается на всё окно в QMainWindow

import sys
from PyQt5 import QtWidgets
from PyQt5 import QtCore
from PyQt5 import QtGui
from PyQt5.QtCore import *
from PyQt5.QtGui import QColor, QFont, QFontDatabase, QIcon, QImage, QPixmap
from PyQt5.QtWidgets import *


class PageGeneral(QMainWindow):
    def __init__(self):
        super().__init__()

        self.page = QtWidgets.QWidget(self)
        self.page.setObjectName("page")
        self.page.setStyleSheet("background-color: rgb(120,120,30);")

        self.gridLayout = QtWidgets.QGridLayout(
            self.page)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setSpacing(0)
        self.label_content = QLabel(
            'Hello World', self, alignment=Qt.AlignCenter)
        self.label_content.setStyleSheet("background-color: #064635")
        self.gridLayout.addWidget(self.label_content, 0, 0)
        self.gridLayout.setRowStretch(0, 1)
        font = self.label_content.font()
        font.setPointSize(20)
        self.label_content.setFont(font)

        self.statusBar()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = PageGeneral()
    window.show()
    sys.exit(app.exec_())

Если я пробую добавить сетку для всего окна

        self.content = QtWidgets.QGridLayout(self)
        self.content.addWidget(self.page)
        self.content.setContentsMargins(0, 0, 0, 0)
        self.content.setSpacing(0)

То при запуске пишет

QLayout: Attempting to add QLayout "" to PageGeneral "", which already has a layout, 

то есть QLayout на QLayout накладываю, я так понимаю. Тогда по какой причине не работает стандартный QLayout от QMainWindow?

Но если я делаю так:

import sys
from PyQt5 import QtWidgets
from PyQt5 import QtCore
from PyQt5 import QtGui
from PyQt5.QtCore import *
from PyQt5.QtGui import QColor, QFont, QFontDatabase, QIcon, QImage, QPixmap
from PyQt5.QtWidgets import *


class PageGeneral(QWidget):
    def __init__(self):
        super().__init__()

        self.page = QtWidgets.QWidget(self)
        self.page.setObjectName("page")
        self.page.setStyleSheet("background-color: rgb(120,120,30);")

        self.content = QtWidgets.QGridLayout(self)
        self.content.addWidget(self.page)
        self.content.setContentsMargins(0, 0, 0, 0)
        self.content.setSpacing(0)

        self.gridLayout = QtWidgets.QGridLayout(
            self.page)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setSpacing(0)
        self.label_content = QLabel(
            'Hello World', self, alignment=Qt.AlignCenter)
        self.label_content.setStyleSheet("background-color: #064635")
        self.gridLayout.addWidget(self.label_content, 0, 0)
        self.gridLayout.setRowStretch(0, 1)
        font = self.label_content.font()
        font.setPointSize(20)
        self.label_content.setFont(font)

        # self.statusBar()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = PageGeneral()
    window.show()
    sys.exit(app.exec_())

То сетка работает как надо и виджеты растягиваются на странице, но в этом случае нет метода statusBar, который мне нужен.

Для интереса создал болванку в Qt Designer, накинул QGridLayout и скомпоновал её по сетке.

При переводе в python-код мне выдало вот что:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.gridLayout = QtWidgets.QGridLayout()
        self.gridLayout.setObjectName("gridLayout")
        self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

То есть говоря простым языком форматировщик создал QGridLayout и здесь он работает, потому что это создал форматировщик, а мной написанный QGridLayout не работает потому что потому. (WTF???).

Помогите разобраться.


Ответы (1 шт):

Автор решения: S. Nick

void QMainWindow::setCentralWidget(QWidget *widget)

Устанавливает данный виджет как центральный виджет главного окна.

Примечание: QMainWindow становится владельцем указателя виджета и удаляет его в соответствующее время.

import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.Qt import *


class PageGeneral(QMainWindow):
    def __init__(self):
        super().__init__()

        self.page = QtWidgets.QWidget(self)
        self.page.setObjectName("page")
        self.page.setStyleSheet("background-color: rgb(120,120,30);")

        self.gridLayout = QtWidgets.QGridLayout(
            self.page)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setSpacing(0)
        self.label_content = QLabel(
            'Hello World', self, alignment=Qt.AlignCenter)
        self.label_content.setStyleSheet("background-color: #064635")
        self.gridLayout.addWidget(self.label_content, 0, 0)
        self.gridLayout.setRowStretch(0, 1)
        font = self.label_content.font()
        font.setPointSize(20)
        self.label_content.setFont(font)

        self.statusBar()
        
        self.setCentralWidget(self.page)                        # +++


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = PageGeneral()
    window.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка