如何解决如何在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
。
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(即垂直布局)。现在,通过执行此操作,如果我单击按钮以显示表格小部件,将不会显示任何内容:
这里我有一个问题,当我单击按钮以显示表格小部件时,表格小部件没有显示,而是显示了一个空白窗口,该窗口也覆盖了侧边菜单栏。
如果我将上面的代码替换为:
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 = self.home_ui.verticalLayout
layout2.addWidget(self.home_ui.tableWidget)
self.home_ui.content_area.setLayout(layout2)
。谁能指导我如何做到这一点。请帮忙。谢谢
更新:
我终于能够解决这个问题。我使用了用作基础布局的水平布局,它有两个子级stacked widgets
和home2.ui
。 content area
和side 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_())
对象检查器的外观如下:
感谢@allec和@musicamante。
解决方法
side_menu_bar
不会出现,因为它没有布局管理器来确定适当的大小。即使您直接将子按钮添加到框架中,除非您明确告知,否则它不会相应地调整大小。您有很多额外的占位符QWidget,尤其是layoutWidget
,verticalLayoutWidget
和page_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)
在按下按钮之前:
按下按钮后:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。