How To Make Nested Stackedlayouts In Pyqt5?
I am creating a PyQt5 application in Python for a university project that uses QStackedLayout to make it a single-windowed app, however, I can not figure out how to nest a Stacked
Solution 1:
You can add a QStackedWidget to the right of the QListWidget and control the chosen list object with the currentRowChanged signal. I would recommend you use QHBoxLayout, QVBoxLayout, or QGridLayout for layout management.
import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow,
QLabel, QPushButton, QWidget,
QStackedLayout, QListWidget,
QVBoxLayout, QStackedWidget,
QGridLayout)
from PyQt5.QtCore import QRect, Qt
classUi(QWidget):
defsetupUi(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 )defmainMenuUi(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)
defhowToMenuUi(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)
defoverViewUi(self):
self.overview_layout = QVBoxLayout()
self.overview_button = QPushButton('Overview')
self.overview_layout.addWidget(self.overview_button)
self.overview_container.setLayout(self.overview_layout)
deflevelUi(self):
self.level_layout = QVBoxLayout()
self.level_button = QPushButton('Level')
self.level_layout.addWidget(self.level_button)
self.level_container.setLayout(self.level_layout)
deftapeMeasureUi(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)
deftheodoliteUi(self):
self.theodolite_layout = QVBoxLayout()
self.theodolite_button = QPushButton('Theodolite')
self.theodolite_layout.addWidget(self.theodolite_button)
self.theodolite_container.setLayout(self.theodolite_layout)
defdisplay_traverse(self, index):
self.traverse_action.setCurrentIndex(index)
classMain(QMainWindow, Ui):
def__init__(self):
super(Main, self).__init__()
self.setupUi(self)
self.menuButton1.clicked.connect(self.menuWindow)
self.howToButton.clicked.connect(self.howToWindow)
defmenuWindow(self):
self.menu.setCurrentIndex(0)
defhowToWindow(self):
self.menu.setCurrentIndex(1)
if __name__ == "__main__":
app = QApplication(sys.argv)
M = Main()
sys.exit(app.exec())
Solution 2:
In the following example a QHBoxLayout is placed in the centralwidget, and as a first element the QListWidget and as a second element the QStackedLayout. To make the change I use the currentRowChanged signal from QListWidget
from PyQt5 import QtCore, QtGui, QtWidgets
classMainWindow(QtWidgets.QMainWindow):
def__init__(self, parent=None):
super(MainWindow, self).__init__(parent)
central_widget = QtWidgets.QWidget()
self.setCentralWidget(central_widget)
hlay = QtWidgets.QHBoxLayout(central_widget)
self.overview_widget = QtWidgets.QWidget()
self.fill_overview()
self.level_widget = QtWidgets.QWidget()
self.fill_level()
self.tape_measure_widget = QtWidgets.QWidget()
self.fill_tape_measure()
self.theodolite_widget = QtWidgets.QWidget()
self.fill_theodolite()
self.list_widget = QtWidgets.QListWidget()
self.slay = QtWidgets.QStackedLayout()
hlay.addWidget(self.list_widget)
hlay.addLayout(self.slay)
hlay.setStretch(0, 0)
hlay.setStretch(1, 1)
self.list_widget.currentRowChanged.connect(self.slay.setCurrentIndex)
for w, text in (
(self.overview_widget, "OVERVIEW"),
(self.level_widget, "LEVEL"),
(self.tape_measure_widget, "TAPE MEASURE"),
(self.theodolite_widget, "THEODOLITE"),
):
self.slay.addWidget(w)
self.list_widget.addItem(text)
deffill_overview(self):
hlay = QtWidgets.QVBoxLayout(self.overview_widget)
hlay.addWidget(
QtWidgets.QLabel("Overview", alignment=QtCore.Qt.AlignCenter)
)
self.overview_widget.setStyleSheet("background-color:green;")
deffill_level(self):
hlay = QtWidgets.QVBoxLayout(self.level_widget)
hlay.addWidget(
QtWidgets.QLabel("Level", alignment=QtCore.Qt.AlignCenter)
)
self.level_widget.setStyleSheet("background-color:blue;")
deffill_tape_measure(self):
hlay = QtWidgets.QVBoxLayout(self.tape_measure_widget)
hlay.addWidget(
QtWidgets.QLabel("Tape Measure", alignment=QtCore.Qt.AlignCenter)
)
self.tape_measure_widget.setStyleSheet("background-color:red;")
deffill_theodolite(self):
hlay = QtWidgets.QVBoxLayout(self.theodolite_widget)
hlay.addWidget(
QtWidgets.QLabel("Theodolite", alignment=QtCore.Qt.AlignCenter)
)
self.theodolite_widget.setStyleSheet("background-color:gray;")
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.resize(640, 240)
w.show()
sys.exit(app.exec_())
Post a Comment for "How To Make Nested Stackedlayouts In Pyqt5?"