QStackedWidget заполняет собой всю сетку QGridLayout и остальных объектов не видно
Для создания страниц перехода по кнопкам я добавил в код QStackedWidget.
Однако с его добавлением фрейм "content" отображает ТОЛЬКО QStackedWidget игнорируя sizeGrip, который без StackedWidget находится внизу окна.
Я пробовал поставить StackedWidget в качестве родителя gridLayout - результат тот же.
Я пробовал поставить label_content в качестве родителя stackedWidget - результат тот же.
Я пробовал ставить content в качестве родителя для StackedWidget, а gridLayout добавлять внутрь этого StackedWidget на первую страницу "page" - тогда всё отображается как надо, но меня не устраивает что необходимую сетку придётся CTRL-C CTRL-V на каждую страницу.
Так же я пробовал вообще убирать self из stackedWidget, но к моему удивлению даже в этом случае StackedWidget отображается перекрывая собой другие элементы (окно закрывал, __pycache__ удалял, код перед запуском сохранял).
Что я делаю не так? Чувствую что ответ где-то на поверхности, но пока что я не могу понять как мне сделать так, чтобы все элементы отображались на StackedWidget.
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 Window(QWidget):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
self.clicks = 0
self.setStyleSheet("background-color: rgb(35,43,50);")
self.setMinimumSize(800, 500)
self.resize(800, 450)
self.setWindowFlags(Qt.FramelessWindowHint)
self.setAttribute(Qt.WA_TranslucentBackground)
self.offset = None
self.offset_title_bar = False
self.top_bar = QFrame()
self.top_bar.setObjectName('top_bar')
self.top_bar.setMaximumHeight(40)
self.top_bar.setFrameShadow(QFrame.Raised)
self.content = QFrame()
self.content.setFrameShadow(QFrame.Raised)
# Pages
self.stackedWidget = QtWidgets.QStackedWidget(self)
self.stackedWidget.setEnabled(True)
#self.stackedWidget.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.stackedWidget.setLayoutDirection(QtCore.Qt.LeftToRight)
self.stackedWidget.setFrameShape(QtWidgets.QFrame.NoFrame)
self.stackedWidget.setFrameShadow(QtWidgets.QFrame.Plain)
self.stackedWidget.setObjectName("stackedWidget")
self.page = QtWidgets.QWidget()
self.page.setObjectName("page")
self.stackedWidget.addWidget(self.page)
self.page.setStyleSheet("background-color: rgb(120,120,30);")
self.page_2 = QtWidgets.QWidget()
self.page_2.setObjectName("page_2")
self.stackedWidget.addWidget(self.page_2)
self.page_2.setStyleSheet("background-color: rgb(180,110,80);")
self.gridLayout = QtWidgets.QGridLayout(self.content)
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)
# vvvvvvvvvvvv Что-то здесь не так
self.gridLayout.addWidget(self.stackedWidget, 0, 1)
self.gridLayout.setRowStretch(0, 1)
font = self.label_content.font()
font.setPointSize(20)
self.label_content.setFont(font)
sizeGrip = QtWidgets.QSizeGrip(self)
sizeGrip.setStyleSheet("background-color: #CD1818")
self.gridLayout.addWidget(
sizeGrip, 1, 0, 1, 1, QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight)
# left_bar
self.left_bar = QFrame()
self.left_bar.setMinimumWidth(50)
self.left_bar.setMaximumWidth(50)
self.left_bar.setFrameShadow(QFrame.StyledPanel | QFrame.Raised)
# title_bar
self.title_bar = QFrame()
self.title_bar.setStyleSheet("background-color: transparent")
self.title_bar.setMinimumWidth(120)
self.gridLayout2 = QtWidgets.QGridLayout(self.title_bar)
self.gridLayout2.setContentsMargins(0, 0, 0, 0)
self.gridLayout2.setSpacing(0)
self.label_title = QLabel('Title_bar', alignment=Qt.AlignCenter)
self.label_title.setObjectName('label_title')
self.label_title.setStyleSheet("background-color: #519259")
font = self.label_title.font()
font.setPointSize(15)
self.label_title.setFont(font)
self.label_title.installEventFilter(self)
self.gridLayout2.addWidget(self.label_title, 0, 0)
# close_button
self.close_button = QPushButton()
self.close_button.setIcon(
QIcon(QPixmap('icons/Apagar/cil-power-standby.png')))
self.close_button.setMinimumHeight(40)
self.close_button.setMaximumWidth(40)
self.close_button.clicked.connect(self.close_window)
self.layout_navigation = QGridLayout(self.top_bar)
self.layout_navigation.addWidget(self.title_bar, 0, 0)
self.layout_navigation.addWidget(self.close_button, 0, 3)
self.layout_navigation.setContentsMargins(0, 0, 0, 0)
self.right_bar = QFrame()
self.right_bar.setFrameShadow(QFrame.Raised)
self.vbox_2 = QVBoxLayout(self.right_bar)
self.vbox_2.addWidget(self.top_bar)
self.vbox_2.addWidget(self.stackedWidget)
self.vbox_2.setContentsMargins(0, 0, 0, 0)
self.vbox_2.setSpacing(0)
self.hbox = QHBoxLayout(self)
self.hbox.setContentsMargins(0, 0, 0, 0)
self.hbox.setSpacing(0)
self.hbox.addWidget(self.left_bar)
self.hbox.addWidget(self.right_bar)
def eventFilter(self, obj, event):
if self.label_title is obj:
if event.type() == QtCore.QEvent.Enter:
self.offset_title_bar = True
elif event.type() == QtCore.QEvent.Leave:
self.offset_title_bar = False
return super().eventFilter(obj, event)
def close_window(self):
self.close()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
Ответы (1 шт):
Объект self.content вам не нужен вообще.
import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
self.setStyleSheet("background-color: rgb(35,43,50);")
self.setMinimumSize(800, 500)
self.resize(800, 450)
self.setWindowFlags(Qt.FramelessWindowHint)
self.setAttribute(Qt.WA_TranslucentBackground)
self.clicks = 0
self.offset = None
self.offset_title_bar = False
self.top_bar = QFrame()
self.top_bar.setObjectName('top_bar')
self.top_bar.setMaximumHeight(40)
self.top_bar.setFrameShadow(QFrame.Raised)
# ???
# self.content = QFrame()
# self.content.setFrameShadow(QFrame.Raised)
# self.content.setStyleSheet("background-color: rgb(255,43,50);")
# Pages
self.stackedWidget = QtWidgets.QStackedWidget(self)
self.stackedWidget.setEnabled(True)
self.stackedWidget.setLayoutDirection(QtCore.Qt.LeftToRight)
self.stackedWidget.setFrameShape(QtWidgets.QFrame.NoFrame)
self.stackedWidget.setFrameShadow(QtWidgets.QFrame.Plain)
self.stackedWidget.setObjectName("stackedWidget")
self.page = QtWidgets.QWidget()
self.page.setObjectName("page")
self.stackedWidget.addWidget(self.page)
self.page.setStyleSheet("background-color: rgb(120,120,30);")
self.page_2 = QtWidgets.QWidget()
self.page_2.setObjectName("page_2")
self.stackedWidget.addWidget(self.page_2)
self.page_2.setStyleSheet("background-color: rgb(180,110,80);")
# +++ vvvvvvvvv
self.gridLayout = QtWidgets.QGridLayout(self.page) # - (self.content)
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)
# vvvvvvvvvvvv Что-то здесь не так
# stackedWidget вставлен ниже в строке --> self.vbox_2.addWidget(self.stackedWidget)
# self.gridLayout.addWidget(self.stackedWidget, 0, 1)
self.gridLayout.setRowStretch(0, 1)
font = self.label_content.font()
font.setPointSize(20)
self.label_content.setFont(font)
sizeGrip = QtWidgets.QSizeGrip(self)
sizeGrip.setStyleSheet("background-color: #CD1818")
self.gridLayout.addWidget(
sizeGrip, 1, 0, 1, 1, QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight)
# left_bar
self.left_bar = QFrame()
self.left_bar.setMinimumWidth(50)
self.left_bar.setMaximumWidth(50)
self.left_bar.setFrameShadow(QFrame.StyledPanel | QFrame.Raised)
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
self.button_page = QPushButton('1 Page')
self.button_page.clicked.connect(lambda : self.stackedWidget.setCurrentIndex(0))
self.button_page_2 = QPushButton('2 Page')
self.button_page_2.clicked.connect(lambda : self.stackedWidget.setCurrentIndex(1))
self.vbox_left_bar = QVBoxLayout(self.left_bar)
self.vbox_left_bar.addWidget(self.button_page)
self.vbox_left_bar.addWidget(self.button_page_2)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# title_bar
self.title_bar = QFrame()
self.title_bar.setStyleSheet("background-color: transparent")
self.title_bar.setMinimumWidth(120)
self.gridLayout2 = QtWidgets.QGridLayout(self.title_bar)
self.gridLayout2.setContentsMargins(0, 0, 0, 0)
self.gridLayout2.setSpacing(0)
self.label_title = QLabel('Title_bar', alignment=Qt.AlignCenter)
self.label_title.setObjectName('label_title')
self.label_title.setStyleSheet("background-color: #519259")
font = self.label_title.font()
font.setPointSize(15)
self.label_title.setFont(font)
self.label_title.installEventFilter(self)
self.gridLayout2.addWidget(self.label_title, 0, 0)
# close_button
self.close_button = QPushButton()
self.close_button.setIcon(
QIcon(QPixmap('Ok.png')))
self.close_button.setMinimumHeight(40)
self.close_button.setMaximumWidth(40)
self.close_button.clicked.connect(self.close_window)
self.layout_navigation = QGridLayout(self.top_bar)
self.layout_navigation.addWidget(self.title_bar, 0, 0)
self.layout_navigation.addWidget(self.close_button, 0, 3)
self.layout_navigation.setContentsMargins(0, 0, 0, 0)
self.right_bar = QFrame()
self.right_bar.setFrameShadow(QFrame.Raised)
self.vbox_2 = QVBoxLayout(self.right_bar)
self.vbox_2.addWidget(self.top_bar)
self.vbox_2.addWidget(self.stackedWidget)
self.vbox_2.setContentsMargins(0, 0, 0, 0)
self.vbox_2.setSpacing(0)
self.hbox = QHBoxLayout(self)
self.hbox.setContentsMargins(0, 0, 0, 0)
self.hbox.setSpacing(0)
self.hbox.addWidget(self.left_bar)
self.hbox.addWidget(self.right_bar)
def eventFilter(self, obj, event):
if self.label_title is obj:
if event.type() == QtCore.QEvent.Enter:
self.offset_title_bar = True
elif event.type() == QtCore.QEvent.Leave:
self.offset_title_bar = False
return super().eventFilter(obj, event)
def close_window(self):
self.close()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
Update
Да, я так пробовал. Указывал родителем 1 страницу stackedWidget для gridLayout. Но фрейм с изменением размеров окна оказывался естественно только на первой странице. На второй фрейма нет. Мне нужно чтобы на всех страницах, независимо на какую кнопку я кликнул, была эта QSizeGrip.
Тогда вам надо вставить QSizeGrip и на другие страницы.
import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
self.setStyleSheet("background-color: rgb(35,43,50);")
self.setMinimumSize(800, 500)
self.resize(800, 450)
self.setWindowFlags(Qt.FramelessWindowHint)
self.setAttribute(Qt.WA_TranslucentBackground)
self.clicks = 0
self.offset = None
self.offset_title_bar = False
self.top_bar = QFrame()
self.top_bar.setObjectName('top_bar')
self.top_bar.setMaximumHeight(40)
self.top_bar.setFrameShadow(QFrame.Raised)
# ???
# self.content = QFrame()
# self.content.setFrameShadow(QFrame.Raised)
# self.content.setStyleSheet("background-color: rgb(255,43,50);")
# Pages
self.stackedWidget = QtWidgets.QStackedWidget(self)
self.stackedWidget.setEnabled(True)
self.stackedWidget.setLayoutDirection(QtCore.Qt.LeftToRight)
self.stackedWidget.setFrameShape(QtWidgets.QFrame.NoFrame)
self.stackedWidget.setFrameShadow(QtWidgets.QFrame.Plain)
self.stackedWidget.setObjectName("stackedWidget")
self.page = QtWidgets.QWidget()
self.page.setObjectName("page")
self.stackedWidget.addWidget(self.page)
self.page.setStyleSheet("background-color: rgb(120,120,30);")
self.page_2 = QtWidgets.QWidget()
self.page_2.setObjectName("page_2")
self.stackedWidget.addWidget(self.page_2)
self.page_2.setStyleSheet("background-color: rgb(180,110,80);")
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
self.gridLayout_2 = QtWidgets.QGridLayout(self.page_2)
self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
self.gridLayout_2.setSpacing(0)
self.label_content_2 = QLabel(
'Page 2', self, alignment=Qt.AlignCenter)
self.gridLayout_2.addWidget(self.label_content_2, 0, 0)
sizeGrip = QtWidgets.QSizeGrip(self)
sizeGrip.setStyleSheet("background-color: #CD1818")
self.gridLayout_2.addWidget(
sizeGrip, 1, 0, 1, 1, QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# +++ vvvvvvvvv
self.gridLayout = QtWidgets.QGridLayout(self.page) # - (self.content)
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)
# vvvvvvvvvvvv Что-то здесь не так
# stackedWidget вставлен ниже в строке --> self.vbox_2.addWidget(self.stackedWidget)
# self.gridLayout.addWidget(self.stackedWidget, 0, 1)
self.gridLayout.setRowStretch(0, 1)
font = self.label_content.font()
font.setPointSize(20)
self.label_content.setFont(font)
sizeGrip = QtWidgets.QSizeGrip(self)
sizeGrip.setStyleSheet("background-color: #CD1818")
self.gridLayout.addWidget(
sizeGrip, 1, 0, 1, 1, QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight)
# left_bar
self.left_bar = QFrame()
self.left_bar.setMinimumWidth(50)
self.left_bar.setMaximumWidth(50)
self.left_bar.setFrameShadow(QFrame.StyledPanel | QFrame.Raised)
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
self.button_page = QPushButton('1 Page')
self.button_page.clicked.connect(lambda : self.stackedWidget.setCurrentIndex(0))
self.button_page_2 = QPushButton('2 Page')
self.button_page_2.clicked.connect(lambda : self.stackedWidget.setCurrentIndex(1))
self.vbox_left_bar = QVBoxLayout(self.left_bar)
self.vbox_left_bar.addWidget(self.button_page)
self.vbox_left_bar.addWidget(self.button_page_2)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# title_bar
self.title_bar = QFrame()
self.title_bar.setStyleSheet("background-color: transparent")
self.title_bar.setMinimumWidth(120)
self.gridLayout2 = QtWidgets.QGridLayout(self.title_bar)
self.gridLayout2.setContentsMargins(0, 0, 0, 0)
self.gridLayout2.setSpacing(0)
self.label_title = QLabel('Title_bar', alignment=Qt.AlignCenter)
self.label_title.setObjectName('label_title')
self.label_title.setStyleSheet("background-color: #519259")
font = self.label_title.font()
font.setPointSize(15)
self.label_title.setFont(font)
self.label_title.installEventFilter(self)
self.gridLayout2.addWidget(self.label_title, 0, 0)
# close_button
self.close_button = QPushButton()
self.close_button.setIcon(
QIcon(QPixmap('Ok.png')))
self.close_button.setMinimumHeight(40)
self.close_button.setMaximumWidth(40)
self.close_button.clicked.connect(self.close_window)
self.layout_navigation = QGridLayout(self.top_bar)
self.layout_navigation.addWidget(self.title_bar, 0, 0)
self.layout_navigation.addWidget(self.close_button, 0, 3)
self.layout_navigation.setContentsMargins(0, 0, 0, 0)
self.right_bar = QFrame()
self.right_bar.setFrameShadow(QFrame.Raised)
self.vbox_2 = QVBoxLayout(self.right_bar)
self.vbox_2.addWidget(self.top_bar)
self.vbox_2.addWidget(self.stackedWidget)
self.vbox_2.setContentsMargins(0, 0, 0, 0)
self.vbox_2.setSpacing(0)
self.hbox = QHBoxLayout(self)
self.hbox.setContentsMargins(0, 0, 0, 0)
self.hbox.setSpacing(0)
self.hbox.addWidget(self.left_bar)
self.hbox.addWidget(self.right_bar)
def eventFilter(self, obj, event):
if self.label_title is obj:
if event.type() == QtCore.QEvent.Enter:
self.offset_title_bar = True
elif event.type() == QtCore.QEvent.Leave:
self.offset_title_bar = False
return super().eventFilter(obj, event)
def close_window(self):
self.close()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())


