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 шт):
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_())
