简体   繁体   中英

Common buttons and positioning in PyQt5's QStackedLayout

I am creating a Python PyQt5 app for a university project, which uses QStackedLayout to keep the app single-windowed.

First question: how can I create buttons that appear on every window and have the same function and property without having to recreate them in every window's UI setup (like in the code) ?

Second question: after switching windows, how can I open the newly opened window at the previous's position? Right now they just open at the centre of the screen. I assume pos() or QPoint should be used but I can not figure out how.

import sys

from PyQt5.QtWidgets import (QApplication,
                             QMainWindow, 
                             QPushButton,
                             QWidget,
                             QStackedLayout)

class Ui(QWidget):

    def setupUi(self, Main):

        self.application_width  = 200
        self.application_height = 200

        self.stack = QStackedLayout()

        self.window_1 = QWidget()        
        self.window_2 = QWidget()

        self.window_1_UI()
        self.window_2_UI()

        self.stack.addWidget(self.window_1)
        self.stack.addWidget(self.window_2)

    def window_1_UI(self):

        self.window_1.setFixedSize(self.application_width, self.application_height)       
        self.window_1.setWindowTitle("1")

        '''REPLACE THIS BUTTON'''
        self.window_1_button = QPushButton("Change window", self.window_1)

    def window_2_UI(self):

        self.window_2.setFixedSize(self.application_width, self.application_height)
        self.window_2.setWindowTitle("2")

        '''AND REPLACE THIS BUTTON'''
        self.window_2_button = QPushButton("Change window", self.window_2)

class Main(QMainWindow, Ui):

    def __init__(self):

        super(Main, self).__init__()

        self.setupUi(self)

        self.window_1_button.clicked.connect(self.change_window)
        self.window_2_button.clicked.connect(self.change_window)

    def change_window(self):

        if self.stack.currentIndex() == 0:

            self.stack.setCurrentIndex(1)

        else:

            self.stack.setCurrentIndex(0)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    M = Main()
    sys.exit(app.exec())

Put your button outside your widgets (in your Main widget). The Ui class should manage the stacked layout.

For example:

class Ui(QWidget):

    def setupUi(self, Main):
        self.stack = QStackedLayout()

        self.window_1 = QWidget()
        self.window_2 = QWidget()

        self.window_1_UI()
        self.window_2_UI()

        self.stack.addWidget(self.window_1)
        self.stack.addWidget(self.window_2)

        # Only one button
        self.btn = QPushButton("Change window", self)

        # Create the central widget of your Main Window
        self.main_widget = QWidget()
        layout = QVBoxLayout(self.main_widget)
        layout.addLayout(self.stack)
        layout.addWidget(self.btn)

        self.setCentralWidget(self.main_widget)

        self.btn.clicked.connect(self.change_window)

    def change_window(self):
        if self.stack.currentIndex() == 0:
            self.stack.setCurrentIndex(1)
        else:
            self.stack.setCurrentIndex(0)

    def window_1_UI(self):
        label = QLabel("In Window 1", self.window_1)

    def window_2_UI(self):
        label = QLabel("In Window 2", self.window_2)

class Main(QMainWindow, Ui):

    def __init__(self):
        super(Main, self).__init__()
        self.setupUi(self)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    M = Main()
    M.show()
    sys.exit(app.exec())

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM