在PyQt5 Python中,如何根据窗口大小调整PyQt5堆叠小部件的大小?

在PyQt5 Python中,如何根据窗口大小调整PyQt5堆叠小部件的大小?,python,pyqt5,qt-designer,qtablewidget,qstackedwidget,Python,Pyqt5,Qt Designer,Qtablewidget,Qstackedwidget,我正在qt设计中设计ui。我必须创建一个UI,它有一个带有按钮的侧菜单栏,无论按下哪个按钮,其相应的数据都将显示在右侧 为了设计这个,我在中央小部件的水平布局中放置了两个QFrame。我缩小了左侧QFrame的宽度,命名为side\u menu\u bar,因此它变成了side menu bar。在右侧的QFrame命名为content\u区域,我放置了一个具有多个页面的stackedWidget 现在,我想在stackedWidget上显示的任何数据都必须覆盖content\u区域的整个区域,

我正在
qt设计中设计
ui
。我必须创建一个UI,它有一个带有按钮的侧菜单栏,无论按下哪个按钮,其相应的数据都将显示在右侧

为了设计这个,我在中央小部件的
水平布局中放置了两个
QFrame
。我缩小了左侧
QFrame
的宽度,命名为
side\u menu\u bar
,因此它变成了side menu bar。在右侧的
QFrame
命名为
content\u区域
,我放置了一个具有多个页面的
stackedWidget

现在,我想在
stackedWidget
上显示的任何数据都必须覆盖
content\u区域的整个区域,因此我在
stackedWidget
上使用了
垂直布局。在
stackedWidget
页面上,我放置了一个
tablewidget
。如果用户单击侧面菜单栏上的
按钮
,将显示此
页面

以下是UI文件的python代码:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'home2.ui'
#
# Created by: PyQt5 UI code generator 5.15.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_home_window(object):
    def setupUi(self, home_window):
        home_window.setObjectName("home_window")
        home_window.resize(1216, 613)
        self.centralwidget = QtWidgets.QWidget(home_window)
        self.centralwidget.setObjectName("centralwidget")
        self.layoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.layoutWidget.setGeometry(QtCore.QRect(2, 0, 1211, 611))
        self.layoutWidget.setObjectName("layoutWidget")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.layoutWidget)
        self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.side_menu_bar = QtWidgets.QFrame(self.layoutWidget)
        self.side_menu_bar.setMinimumSize(QtCore.QSize(0, 0))
        self.side_menu_bar.setMaximumSize(QtCore.QSize(120, 16777215))
        self.side_menu_bar.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.side_menu_bar.setFrameShadow(QtWidgets.QFrame.Raised)
        self.side_menu_bar.setObjectName("side_menu_bar")
        self.pushButton = QtWidgets.QPushButton(self.side_menu_bar)
        self.pushButton.setGeometry(QtCore.QRect(20, 100, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout_2.addWidget(self.side_menu_bar)
        self.content_area = QtWidgets.QFrame(self.layoutWidget)
        self.content_area.setStyleSheet("background-color: rgb(170, 255, 0);")
        self.content_area.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.content_area.setFrameShadow(QtWidgets.QFrame.Raised)
        self.content_area.setObjectName("content_area")
        self.verticalLayoutWidget = QtWidgets.QWidget(self.content_area)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(9, 9, 1071, 591))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.stackedWidget = QtWidgets.QStackedWidget(self.verticalLayoutWidget)
        self.stackedWidget.setObjectName("stackedWidget")
        self.page = QtWidgets.QWidget()
        self.page.setObjectName("page")
        self.stackedWidget.addWidget(self.page)
        self.page_2 = QtWidgets.QWidget()
        self.page_2.setObjectName("page_2")
        self.tableWidget = QtWidgets.QTableWidget(self.page_2)
        self.tableWidget.setGeometry(QtCore.QRect(0, 0, 1071, 591))
        self.tableWidget.setRowCount(50)
        self.tableWidget.setColumnCount(50)
        self.tableWidget.setObjectName("tableWidget")
        self.stackedWidget.addWidget(self.page_2)
        self.verticalLayout.addWidget(self.stackedWidget)
        self.horizontalLayout_2.addWidget(self.content_area)
        home_window.setCentralWidget(self.centralwidget)

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

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


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    home_window = QtWidgets.QMainWindow()
    ui = Ui_home_window()
    ui.setupUi(home_window)
    home_window.show()
    sys.exit(app.exec_())
下面是我在
app.py

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from src.home2_ui import Ui_home_window


class HomeWindow(QMainWindow, Ui_home_window):
    def __init__(self):
        QMainWindow.__init__(self)
        self.home_ui = Ui_home_window()
        self.home_ui.setupUi(self)
        self.showMaximized()

        layout = self.home_ui.horizontalLayout_2
        self.home_ui.centralwidget.setLayout(layout)

        self.home_ui.pushButton.clicked.connect(self.show_page2)

    def show_page2(self):
        layout2 = self.home_ui.verticalLayout
        layout2.addWidget(self.home_ui.stackedWidget)
        self.home_ui.content_area.setLayout(layout2)


app = QApplication(sys.argv)
main_window = HomeWindow()
main_window.show()
sys.exit(app.exec_())
现在,根据我的理解,我希望全屏显示我的应用程序,并希望适合窗口的整个区域。因此,我将
水平布局
附加到
中心小部件

layout = self.home_ui.horizontalLayout_2
self.home_ui.centralwidget.setLayout(layout)
现在,为了使表格小部件覆盖堆叠小部件的整个区域,我在按钮按下事件中使用了以下代码:

layout2 = self.home_ui.verticalLayout
layout2.addWidget(self.home_ui.stackedWidget)
self.home_ui.content_area.setLayout(layout2)
根据我的理解,我们想要在堆叠小部件中显示的任何小部件都必须覆盖堆叠小部件的整个区域,因此我将堆叠小部件附加到垂直布局,然后将内容区域的布局设置为layout2(即垂直布局)。现在,通过这样做,如果我单击按钮以显示表格小部件,则不会显示任何内容:

这里我有一个问题,当我点击按钮显示表格小部件时,表格小部件并没有显示,而是显示一个空白窗口,它也覆盖了侧菜单栏

如果我将上述代码替换为:

layout2 = self.home_ui.verticalLayout
layout2.addWidget(self.home_ui.tableWidget)
self.home_ui.content_area.setLayout(layout2)
因此,在本例中,我将表格小部件添加到垂直布局中,而不是堆叠小部件。以下是输出:

它确实显示表格,但仅在半屏幕上显示。此外,它还删除了侧菜单栏

我无法完全理解在使用堆叠小部件时如何使用
布局
。谁能告诉我怎么做。请帮忙。谢谢

以下是下载
home2.ui
文件的步骤

更新:

我终于解决了这个问题。我使用了作为基本布局的水平布局,它有两个子菜单栏
侧菜单栏
内容区和
侧菜单栏都有垂直布局。在
侧菜单栏中
我可以添加任意数量的内容,并且由于垂直布局,它将自动对齐。在
内容区
中,我添加了堆叠小部件,它又是垂直布局的子部件。在堆叠小部件的第2页中,我必须添加另一个垂直布局,然后添加表小部件。现在它完美地展现出来了

以下是所有代码:

用户界面代码:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'home5.ui'
#
# Created by: PyQt5 UI code generator 5.15.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_home_window(object):
    def setupUi(self, home_window):
        home_window.setObjectName("home_window")
        home_window.resize(1196, 573)
        self.centralwidget = QtWidgets.QWidget(home_window)
        self.centralwidget.setObjectName("centralwidget")
        self.widget = QtWidgets.QWidget(self.centralwidget)
        self.widget.setGeometry(QtCore.QRect(10, 10, 1181, 561))
        self.widget.setObjectName("widget")
        self.base_h_layout = QtWidgets.QHBoxLayout(self.widget)
        self.base_h_layout.setContentsMargins(0, 0, 0, 0)
        self.base_h_layout.setSpacing(0)
        self.base_h_layout.setObjectName("base_h_layout")
        self.side_menu_bar = QtWidgets.QFrame(self.widget)
        self.side_menu_bar.setMaximumSize(QtCore.QSize(120, 16777215))
        self.side_menu_bar.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.side_menu_bar.setFrameShadow(QtWidgets.QFrame.Raised)
        self.side_menu_bar.setObjectName("side_menu_bar")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.side_menu_bar)
        self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_2.setSpacing(0)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.menu_bar_v_layout = QtWidgets.QVBoxLayout()
        self.menu_bar_v_layout.setContentsMargins(10, 10, 10, 10)
        self.menu_bar_v_layout.setSpacing(10)
        self.menu_bar_v_layout.setObjectName("menu_bar_v_layout")
        self.pushButton = QtWidgets.QPushButton(self.side_menu_bar)
        self.pushButton.setObjectName("pushButton")
        self.menu_bar_v_layout.addWidget(self.pushButton)
        self.verticalLayout_2.addLayout(self.menu_bar_v_layout)
        self.base_h_layout.addWidget(self.side_menu_bar)
        self.content_area = QtWidgets.QFrame(self.widget)
        self.content_area.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.content_area.setFrameShadow(QtWidgets.QFrame.Raised)
        self.content_area.setObjectName("content_area")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.content_area)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setSpacing(0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.content_area_v_layout = QtWidgets.QVBoxLayout()
        self.content_area_v_layout.setSpacing(0)
        self.content_area_v_layout.setObjectName("content_area_v_layout")
        self.stackedWidget = QtWidgets.QStackedWidget(self.content_area)
        self.stackedWidget.setObjectName("stackedWidget")
        self.page = QtWidgets.QWidget()
        self.page.setObjectName("page")
        self.stackedWidget.addWidget(self.page)
        self.page_2 = QtWidgets.QWidget()
        self.page_2.setObjectName("page_2")
        self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.page_2)
        self.verticalLayout_4.setObjectName("verticalLayout_4")
        self.table_v_layout = QtWidgets.QVBoxLayout()
        self.table_v_layout.setSpacing(0)
        self.table_v_layout.setObjectName("table_v_layout")
        self.tableWidget = QtWidgets.QTableWidget(self.page_2)
        self.tableWidget.setRowCount(50)
        self.tableWidget.setColumnCount(50)
        self.tableWidget.setObjectName("tableWidget")
        self.table_v_layout.addWidget(self.tableWidget)
        self.verticalLayout_4.addLayout(self.table_v_layout)
        self.stackedWidget.addWidget(self.page_2)
        self.content_area_v_layout.addWidget(self.stackedWidget)
        self.verticalLayout.addLayout(self.content_area_v_layout)
        self.base_h_layout.addWidget(self.content_area)
        home_window.setCentralWidget(self.centralwidget)

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

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


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

class HomeWindow(QMainWindow, Ui_home_window):
    def __init__(self):
        QMainWindow.__init__(self)
        self.home_ui = Ui_home_window()
        self.home_ui.setupUi(self)
        self.showMaximized()

        base_layout = self.home_ui.base_h_layout
        self.home_ui.centralwidget.setLayout(base_layout)

        side_menu_v_layout = self.home_ui.menu_bar_v_layout
        self.home_ui.side_menu_bar.setLayout(side_menu_v_layout)

        content_v_layout = self.home_ui.content_area_v_layout
        self.home_ui.content_area.setLayout(content_v_layout)

        table_layout = self.home_ui.table_v_layout
        self.home_ui.page_2.setLayout(table_layout)

        self.home_ui.pushButton.clicked.connect(self.show_page2)

    def show_page2(self):
        self.home_ui.stackedWidget.setCurrentWidget(self.home_ui.page_2)
这就是
qt设计器
对象检查器的外观:


多亏了@allec和@musicamante.

侧面菜单栏不会出现,因为它没有布局管理器来确定合适的大小。即使您将子按钮直接添加到框架中,它也不会相应调整大小,除非您明确告诉它。您有许多额外的占位符QWidget,尤其是
布局Widget
垂直布局Widget
、以及
页面2
,这使得此设计变得比必要的更复杂。任何类型的小部件都可以直接添加到布局或堆叠小部件中。这两个Qframe都应该有一个仅包含子窗口小部件的布局

class Ui_home_window(object):
    def setupUi(self, home_window):
        home_window.setObjectName("home_window")
        home_window.resize(1216, 613)
        self.centralwidget = QtWidgets.QWidget(home_window)
        self.centralwidget.setObjectName("centralwidget")
        
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.centralwidget)
        self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.side_menu_bar = QtWidgets.QFrame()
        self.side_menu_bar.setMinimumSize(QtCore.QSize(0, 0))
        self.side_menu_bar.setMaximumSize(QtCore.QSize(120, 16777215))
        self.side_menu_bar.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.side_menu_bar.setFrameShadow(QtWidgets.QFrame.Raised)
        self.side_menu_bar.setObjectName("side_menu_bar")
        self.pushButton = QtWidgets.QPushButton(self.side_menu_bar)
        self.pushButton.setObjectName("pushButton")
        vbox = QtWidgets.QVBoxLayout(self.side_menu_bar)
        vbox.addWidget(self.pushButton)
        self.horizontalLayout_2.addWidget(self.side_menu_bar)
        
        self.content_area = QtWidgets.QFrame()
        self.content_area.setStyleSheet("background-color: rgb(170, 255, 0);")
        self.content_area.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.content_area.setFrameShadow(QtWidgets.QFrame.Raised)
        self.content_area.setObjectName("content_area")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.content_area)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.stackedWidget = QtWidgets.QStackedWidget()
        self.stackedWidget.setObjectName("stackedWidget")
        self.page = QtWidgets.QWidget()
        self.page.setObjectName("page")
        self.stackedWidget.addWidget(self.page)
        self.tableWidget = QtWidgets.QTableWidget()
        self.tableWidget.setRowCount(50)
        self.tableWidget.setColumnCount(50)
        self.tableWidget.setObjectName("tableWidget")
        self.stackedWidget.addWidget(self.tableWidget)
        self.verticalLayout.addWidget(self.stackedWidget)
        self.horizontalLayout_2.addWidget(self.content_area)
        home_window.setCentralWidget(self.centralwidget)

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

    def retranslateUi(self, home_window):
        _translate = QtCore.QCoreApplication.translate
        home_window.setWindowTitle(_translate("home_window", "MainWindow"))
        self.pushButton.setText(_translate("home_window", "PushButton"))
无需在
HomeWindow
中进一步设置窗口小部件的布局,您可以使用
QStackedWidget.setCurrentIndex()
切换到其他页面

按下按钮前:

按下按钮后:


正如您在至少另一个问题中所建议的,您必须正确使用布局管理器(这意味着您需要。为内容区、设置页、报告页和侧菜单栏设置布局。@musicamante我已经用新的细节更新了问题,您能看一下吗?请不要编辑问题来回答自己,这只会使整个主题混淆。您可以创建一个新的答案(如果它实际上是一个新答案)或将相关信息添加到现有文件中。谢谢。您是否可以共享该UI文件,因为我想查看小部件在qt designer的对象检查器中是如何排列的。@SAndrew我不使用qt DesignerOkay。我理解代码,如果有任何问题,我会更新您。谢谢我已经阅读了您的代码,并获得了我已经添加了一张有问题的UI设计的照片,请你检查并确认我的理解是否正确。我已经解决了这个问题。不确定为什么我必须在堆叠小部件的第2页添加另一个垂直布局,直到表格覆盖了所有区域。我已经更新了问题。谢谢
class HomeWindow(QMainWindow, Ui_home_window):
    def __init__(self):
        QMainWindow.__init__(self)
        self.home_ui = Ui_home_window()
        self.home_ui.setupUi(self)
        self.showMaximized()

        self.home_ui.pushButton.clicked.connect(self.show_page2)

    def show_page2(self):
        self.home_ui.stackedWidget.setCurrentIndex(1)