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

问题描述

我正在ui中设计一个qt-desginer。我必须创建一个UI,该UI的侧面菜单栏带有按钮,并且无论按下哪个按钮,其适当的数据都会显示在右侧。

要进行设计,我已经在中央小部件的QFrame中放置了两个horizontal layout。我减小了名为QFrame的左侧side_menu_bar的宽度,因此它已成为侧面菜单栏。在名为QFrame的{​​{1}}的右侧,我放置了一个content_area多页。

现在,无论我要在stackedWidget上显示的任何数据都必须覆盖stackedWidget的整个区域,因此我在content_area上使用了vertical layout。在stackedWidget的{​​{1}}上,我放置了一个page_2。如果用户单击侧面菜单栏上的stackedWidget,则会显示此tablewidget

以下是UI文件的python代码:

page_2

以下是我在pushButton

中的使用方式
# -*- 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,1211,611))
        self.layoutWidget.setObjectName("layoutWidget")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.layoutWidget)
        self.horizontalLayout_2.setContentsMargins(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)
        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,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_())

horizontal layout

现在,为了使表格小部件能够覆盖堆叠小部件的整个区域,我在按钮按下事件中使用了以下代码:

central widget

据我了解,我们要在堆叠式小部件中显示的任何小部件都必须覆盖堆叠式小部件的整个区域,因此我将堆叠式小部件附加到垂直布局,然后将内容区域的布局设置为layout2(即垂直布局)。现在,通过执行此操作,如果我单击按钮以显示表格小部件,将不会显示任何内容:

enter image description here

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

如果我将上面的代码替换为:

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

所以在这种情况下,我将表小部件添加到了垂直布局,而不是堆叠的小部件。下面是输出:

enter image description here

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

使用layout2 = self.home_ui.verticalLayout layout2.addWidget(self.home_ui.stackedWidget) self.home_ui.content_area.setLayout(layout2) 时,我无法完全理解如何使用layout2 = self.home_ui.verticalLayout layout2.addWidget(self.home_ui.tableWidget) self.home_ui.content_area.setLayout(layout2) 。谁能指导我如何做到这一点。请帮忙。谢谢

这里是link,用于下载layout文件

enter image description here

enter image description here

更新

我终于能够解决这个问题。我使用了用作基础布局的水平布局,它有两个子级stacked widgetshome2.uicontent areaside menu bar都具有垂直布局。在content area中,我可以根据需要添加任意数量,由于垂直布局,它将自动对齐。在side menu bar中,我添加了堆叠的小部件,它又是垂直布局的子级。在堆叠小部件的第2页中,我必须添加另一个垂直布局,然后添加表格小部件。现在它显示完美了。

下面是所有代码:

UI代码:

side menu bar

app.py:

content area

# -*- 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,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) 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) 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) 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) 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,"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_()) 对象检查器的外观如下:

enter image description here

感谢@allec和@musicamante。

解决方法

side_menu_bar不会出现,因为它没有布局管理器来确定适当的大小。即使您直接将子按钮添加到框架中,除非您明确告知,否则它不会相应地调整大小。您有很多额外的占位符QWidget,尤其是layoutWidgetverticalLayoutWidgetpage_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)
        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)
        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()切换到另一页面。

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)

在按下按钮之前:

enter image description here

按下按钮后:

enter image description here

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...