Разница между QMainWindow и QWidget PyQT5
Скажите, почему не отображается окно, когда наследуемся от QMainWindow и работает, когда наследуемся от QWidget?
Работает: наследуем от QWidget:
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QFrame, QPushButton
from PyQt5.QtWidgets import QApplication, QMainWindow
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.button_hello = QPushButton('Hello')
self.button_hello.clicked.connect(self.add_button)
self.layout_buttons = QVBoxLayout()
self.layout_buttons.addStretch() # Это добавит пружину, прижимающую виджеты вверх
self.frame = QFrame()
self.frame.setMinimumSize(200, 200)
self.frame.setFrameStyle(QFrame.Box)
self.frame.setLayout(self.layout_buttons)
main_layout = QVBoxLayout()
main_layout.addWidget(self.button_hello)
main_layout.addWidget(self.frame)
self.setLayout(main_layout)
def add_button(self):
button = QPushButton('Кнопка')
self.layout_buttons.insertWidget(0, button) # Добавление в начало, с пружиной это прижмет вверх
# self.layout_buttons.addWidget(button) # Добавление в конец, с пружиной это прижмет вниз
app = QApplication([])
mw = MyWidget()
mw.show()
app.exec()
Не работает: наследуем от QMainWindow:
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QFrame, QPushButton
from PyQt5.QtWidgets import QApplication, QMainWindow
class MyWidget(QMainWindow):
def __init__(self):
super().__init__()
self.button_hello = QPushButton('Hello')
self.button_hello.clicked.connect(self.add_button)
self.layout_buttons = QVBoxLayout()
self.layout_buttons.addStretch() # Это добавит пружину, прижимающую виджеты вверх
self.frame = QFrame()
self.frame.setMinimumSize(200, 200)
self.frame.setFrameStyle(QFrame.Box)
self.frame.setLayout(self.layout_buttons)
main_layout = QVBoxLayout()
main_layout.addWidget(self.button_hello)
main_layout.addWidget(self.frame)
self.setLayout(main_layout)
def add_button(self):
button = QPushButton('Кнопка')
self.layout_buttons.insertWidget(0, button) # Добавление в начало, с пружиной это прижмет вверх
# self.layout_buttons.addWidget(button) # Добавление в конец, с пружиной это прижмет вниз
app = QApplication([])
mw = MyWidget()
mw.show()
app.exec()
P.S. коды различаются только в одной строке:
class MyWidget(QWidget или QMainWindow):
Ответы (2 шт):
Автор решения: Victor VosMottor
→ Ссылка
Потому что классу QMainWindow (в отличии от QWidget) нельзя устанавливать layout.
class MyWidget(QMainWindow):
def __init__(self):
super().__init__()
wid = QWidget()
self.setCentralWidget(wid)
self.lay = QVBoxLayou() # a layout
wid.setLayout(self.lay)
...
Автор решения: S. Nick
→ Ссылка
QMainWindow имеет свой собственный макет. Больше https://doc.qt.io/qt-5/qmainwindow.html#details
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QFrame, QPushButton
from PyQt5.QtWidgets import QApplication, QMainWindow
class MyWidget(QMainWindow): # - QWidget
def __init__(self):
super().__init__()
self.centralWidget = QWidget() # +++
self.setCentralWidget(self.centralWidget) # +++
self.button_hello = QPushButton('Hello')
self.button_hello.clicked.connect(self.add_button)
self.layout_buttons = QVBoxLayout()
self.layout_buttons.addStretch() # Это добавит пружину, прижимающую виджеты вверх
self.frame = QFrame()
self.frame.setMinimumSize(200, 200)
self.frame.setFrameStyle(QFrame.Box)
self.frame.setLayout(self.layout_buttons)
main_layout = QVBoxLayout(self.centralWidget) # + self.centralWidget
main_layout.addWidget(self.button_hello)
main_layout.addWidget(self.frame)
# self.setLayout(main_layout)
def add_button(self):
button = QPushButton('Кнопка')
self.layout_buttons.insertWidget(0, button) # Добавление в начало, с пружиной это прижмет вверх
# self.layout_buttons.addWidget(button) # Добавление в конец, с пружиной это прижмет вниз
app = QApplication([])
mw = MyWidget()
mw.show()
app.exec()
