Python 如何在PyQt5中制作嵌套的StackedLayouts?
我正在用Python为一个大学项目创建一个PyQt5应用程序,该项目使用Python 如何在PyQt5中制作嵌套的StackedLayouts?,python,pyqt,pyqt5,qstackedwidget,Python,Pyqt,Pyqt5,Qstackedwidget,我正在用Python为一个大学项目创建一个PyQt5应用程序,该项目使用QStackedLayout使其成为一个单窗口应用程序,但是,我不知道如何将堆叠的小部件嵌套在堆叠的小部件中 运行代码时(问题已降级),您可以看到主菜单中有一个QPushButton。单击它时,窗口会随着其中的QListWidget而改变 我想要实现的是QListWidget右侧的堆叠小部件,它分别随所选列表项而变化 编辑:是否有方法打开另一个窗口所在的窗口?现在,每当我点击一个按钮,窗口就会弹出在屏幕中间。 在代码中,您可
QStackedLayout
使其成为一个单窗口应用程序,但是,我不知道如何将堆叠的小部件嵌套在堆叠的小部件中
运行代码时(问题已降级),您可以看到主菜单中有一个QPushButton
。单击它时,窗口会随着其中的QListWidget
而改变
我想要实现的是QListWidget
右侧的堆叠小部件,它分别随所选列表项而变化
编辑:是否有方法打开另一个窗口所在的窗口?现在,每当我点击一个按钮,窗口就会弹出在屏幕中间。
在代码中,您可以看到我试图实现的部分,它们后面有注释字符
守则:
import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow,
QLabel, QPushButton, QWidget,
QStackedLayout, QListWidget)
from PyQt5.QtCore import QRect, Qt
class Ui(QWidget):
def setupUi(self, Main):
Main.setObjectName("Main")
Main.setFixedSize(900, 500)
self.width = 900
self.height = 500
self.setFixedSize(self.width, self.height)
'''MENU ON THE MAIN WINDOW'''
self.menu = QStackedLayout()
self. mainMenu = QWidget()
self.howToMenu = QWidget()
self. mainMenuUi()
self.howToMenuUi()
self.menu.addWidget(self. mainMenu)
self.menu.addWidget(self.howToMenu)
'''MENU ON THE HOWTO WINDOW'''
#self.howToMenuMenu = QStackedLayout()
#self.howToOverView = QWidget()
#self.howToLevel = QWidget()
#self.howToTapeMeasure = QWidget()
#self.howToTheodolite = QWidget()
#self. overViewUi()
#self. levelUi()
#self.tapeMeasureUi()
#self. theodoliteUi()
#self.howToMenuMenu.addWidget(self.howToOverView )
#self.howToMenuMenu.addWidget(self.howToLevel )
#self.howToMenuMenu.addWidget(self.howToTapeMeasure)
#self.howToMenuMenu.addWidget(self.howToTheodolite )
def mainMenuUi(self):
self.mainMenu.setFixedSize(self.width, self.height)
self.mainMenuText = QLabel(self.mainMenu)
self.mainMenuText.setGeometry(QRect(30, 120, 480, 200))
self.mainMenuText.setStyleSheet("font: 14pt Century Gothic")
self.mainMenuText.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignTop)
self.mainMenuText.setText("Welcome to the Surveying Traverse Calculator!")
self.howToButton = QPushButton("HOW TO DO A TRAVERSE", self.mainMenu)
self.howToButton.setGeometry(140, 180, 200, 30)
def howToMenuUi(self):
self.howToMenu.setFixedSize(self.width, self.height)
self.menuButton1 = QPushButton("Back to main menu", self.howToMenu)
self.menuButton1.setGeometry(QRect(10, 10, 200, 30))
self.howToTitle = QLabel(self.howToMenu)
self.howToTitle.setGeometry(QRect(10, 50, self.width, 40))
self.howToTitle.setStyleSheet("font: 14pt Century Gothic")
self.howToTitle.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignVCenter)
self.howToTitle.setText("How to Do a Traverse")
self.howToSteps = QListWidget(self.howToMenu)
self.howToSteps.setGeometry(QRect(10, 100, 200, 80))
self.howToSteps.insertItem(0, "OVERVIEW" )
self.howToSteps.insertItem(1, "LEVEL" )
self.howToSteps.insertItem(2, "TAPE MEASURE")
self.howToSteps.insertItem(3, "THEODOLITE" )
#def overViewUi(self):
#def levelUi(self):
#def tapeMeasureUi(self):
#def theodoliteUi(self)
class Main(QMainWindow, Ui):
def __init__(self):
super(Main, self).__init__()
self.setupUi(self)
self.menuButton1.clicked.connect(self. menuWindow)
self.howToButton.clicked.connect(self.howToWindow)
def menuWindow(self):
self.menu.setCurrentIndex(0)
def howToWindow(self):
self.menu.setCurrentIndex(1)
if __name__ == "__main__":
app = QApplication(sys.argv)
M = Main()
sys.exit(app.exec())
如何解决此问题?在下面的示例中,QHBoxLayout放置在centralwidget中,作为第一个元素,QListWidget,作为第二个元素,QStackedLayout。要进行更改,我使用来自QListWidget的currentRowChanged信号
从PyQt5导入QtCore、QtGui、qtwidget
类MainWindow(QtWidgets.QMainWindow):
def uuu init uuu(self,parent=None):
超级(主窗口,自我)。\uuuuu初始化\uuuuuuu(父级)
central_widget=qtwidts.QWidget()
self.setCentralWidget(中心窗口小部件)
hlay=qtwidts.QHBoxLayout(中心小部件)
self.overview_widget=qtwidts.QWidget()
self.fill_概述()
self.level_widget=qtwidts.QWidget()
自我填充水平()
self.tape\u measure\u widget=qtwidts.QWidget()
自填卷尺
self.Theodolote_widget=qtwidts.QWidget()
自填充经纬仪()
self.list_widget=qtwidts.QListWidget()
self.slay=QtWidgets.QStackedLayout()
hlay.addWidget(self.list\u小部件)
hlay.addLayout(self.slay)
hlay.setStretch(0,0)
hlay.setStretch(1,1)
self.list\u widget.currentRowChanged.connect(self.slay.setCurrentIndex)
对于w,文本为(
(self.overview_小部件,“overview”),
(self.level_小部件,“level”),
(self.tape\u measure\u小部件,“tape measure”),
(self.theodolote_小部件,“Theodolote”),
):
self.slay.addWidget(w)
self.list\u widget.addItem(文本)
def加注口概述(自我):
hlay=qtwidts.QVBoxLayout(self.overview\u小部件)
hlay.addWidget(
qtwidts.QLabel(“概述”,alignment=QtCore.Qt.AlignCenter)
)
self.overview_widget.setStyleSheet(“背景色:绿色;”)
def加注液位(自身):
hlay=qtwidts.QVBoxLayout(self.level\u小部件)
hlay.addWidget(
qtwidts.QLabel(“Level”,alignment=QtCore.Qt.AlignCenter)
)
self.level_widget.setStyleSheet(“背景色:蓝色;”)
def填充带测量(自身):
hlay=qtwidts.QVBoxLayout(self.tape\u measure\u小部件)
hlay.addWidget(
qtwidts.QLabel(“卷尺”,alignment=QtCore.Qt.AlignCenter)
)
self.tape\u measure\u widget.setStyleSheet(“背景色:红色;”)
def fill_经纬仪(自身):
hlay=qtwidts.QVBoxLayout(self.theodolote_小部件)
hlay.addWidget(
qtwidts.QLabel(“经纬仪”,alignment=QtCore.Qt.AlignCenter)
)
self.theodolote_widget.setStyleSheet(“背景色:灰色;”)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=主窗口()
w、 调整大小(640240)
w、 show()
sys.exit(app.exec_())
您可以在QListWidget
的右侧添加QStackedWidget
,并使用currentRowChanged
信号控制所选列表对象。我建议您使用QHBoxLayout
、QVBoxLayout
或QGridLayout
进行布局管理
import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow,
QLabel, QPushButton, QWidget,
QStackedLayout, QListWidget,
QVBoxLayout, QStackedWidget,
QGridLayout)
from PyQt5.QtCore import QRect, Qt
class Ui(QWidget):
def setupUi(self, Main):
Main.setObjectName("Main")
Main.setFixedSize(900, 500)
self.width = 900
self.height = 500
self.setFixedSize(self.width, self.height)
'''MENU ON THE MAIN WINDOW'''
self.menu = QStackedLayout()
self.mainMenu = QWidget()
self.howToMenu = QWidget()
self.mainMenuUi()
self.howToMenuUi()
self.menu.addWidget(self.mainMenu)
self.menu.addWidget(self.howToMenu)
'''MENU ON THE HOWTO WINDOW'''
#self.howToMenuMenu = QStackedLayout()
#self.howToOverView = QWidget()
#self.howToLevel = QWidget()
#self.howToTapeMeasure = QWidget()
#self.howToTheodolite = QWidget()
#self. overViewUi()
#self. levelUi()
#self.tapeMeasureUi()
#self. theodoliteUi()
#self.howToMenuMenu.addWidget(self.howToOverView )
#self.howToMenuMenu.addWidget(self.howToLevel )
#self.howToMenuMenu.addWidget(self.howToTapeMeasure)
#self.howToMenuMenu.addWidget(self.howToTheodolite )
def mainMenuUi(self):
self.mainMenu.setFixedSize(self.width, self.height)
self.mainMenuText = QLabel(self.mainMenu)
self.mainMenuText.setGeometry(QRect(30, 120, 480, 200))
self.mainMenuText.setStyleSheet("font: 14pt Century Gothic")
self.mainMenuText.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignTop)
self.mainMenuText.setText("Welcome to the Surveying Traverse Calculator!")
self.howToButton = QPushButton("HOW TO DO A TRAVERSE", self.mainMenu)
self.howToButton.setGeometry(140, 180, 200, 30)
def howToMenuUi(self):
self.howToMenu_layout = QGridLayout()
self.howToMenu.setFixedSize(self.width, self.height)
self.menuButton1 = QPushButton("Back to main menu")
self.menuButton1.setGeometry(QRect(10, 10, 200, 30))
self.howToTitle = QLabel()
self.howToTitle.setGeometry(QRect(10, 50, self.width, 40))
self.howToTitle.setStyleSheet("font: 14pt Century Gothic")
self.howToTitle.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignVCenter)
self.howToTitle.setText("How to Do a Traverse")
self.howToSteps = QListWidget()
self.howToSteps.setGeometry(QRect(10, 100, 200, 80))
self.howToSteps.insertItem(0, "OVERVIEW" )
self.howToSteps.insertItem(1, "LEVEL" )
self.howToSteps.insertItem(2, "TAPE MEASURE")
self.howToSteps.insertItem(3, "THEODOLITE" )
self.howToSteps.currentRowChanged.connect(self.display_traverse)
self.overview_container = QWidget()
self.level_container = QWidget()
self.tape_measure_container = QWidget()
self.theodolite_container = QWidget()
self.overViewUi()
self.levelUi()
self.tapeMeasureUi()
self.theodoliteUi()
self.traverse_action = QStackedWidget()
self.traverse_action.addWidget(self.overview_container)
self.traverse_action.addWidget(self.level_container)
self.traverse_action.addWidget(self.tape_measure_container)
self.traverse_action.addWidget(self.theodolite_container)
self.traverse_action.setCurrentIndex(0)
self.howToMenu_left_layout = QVBoxLayout()
self.howToMenu_left_layout.addWidget(self.menuButton1)
self.howToMenu_left_layout.addWidget(self.howToTitle)
self.howToMenu_left_layout.addWidget(self.howToSteps)
self.howToMenu_layout.addLayout(self.howToMenu_left_layout,0,0,1,1)
self.howToMenu_layout.addWidget(self.traverse_action,0,1,1,1)
self.howToMenu.setLayout(self.howToMenu_layout)
def overViewUi(self):
self.overview_layout = QVBoxLayout()
self.overview_button = QPushButton('Overview')
self.overview_layout.addWidget(self.overview_button)
self.overview_container.setLayout(self.overview_layout)
def levelUi(self):
self.level_layout = QVBoxLayout()
self.level_button = QPushButton('Level')
self.level_layout.addWidget(self.level_button)
self.level_container.setLayout(self.level_layout)
def tapeMeasureUi(self):
self.tape_measure_layout = QVBoxLayout()
self.tape_measure_button = QPushButton('Tape measure')
self.tape_measure_layout.addWidget(self.tape_measure_button)
self.tape_measure_container.setLayout(self.tape_measure_layout)
def theodoliteUi(self):
self.theodolite_layout = QVBoxLayout()
self.theodolite_button = QPushButton('Theodolite')
self.theodolite_layout.addWidget(self.theodolite_button)
self.theodolite_container.setLayout(self.theodolite_layout)
def display_traverse(self, index):
self.traverse_action.setCurrentIndex(index)
class Main(QMainWindow, Ui):
def __init__(self):
super(Main, self).__init__()
self.setupUi(self)
self.menuButton1.clicked.connect(self.menuWindow)
self.howToButton.clicked.connect(self.howToWindow)
def menuWindow(self):
self.menu.setCurrentIndex(0)
def howToWindow(self):
self.menu.setCurrentIndex(1)
if __name__ == "__main__":
app = QApplication(sys.argv)
M = Main()
sys.exit(app.exec())