简体   繁体   English

在 PyQt5 中使用 QStackedWidget

[英]Using QStackedWidget in PyQt5

I have QStackedWidget in ApplicationWindow class and buttons which are going to point to different QWidgets in MenuWindow.我在 ApplicationWindow class 中有 QStackedWidget 和将指向 MenuWindow 中不同 QWidget 的按钮。 I need a help with writing a function which would change the CurrentWidget according to button clicked - eg login_button would change the CurrentWidget to LoginWindow.我在编写 function 时需要帮助,它会根据单击的按钮更改 CurrentWidget - 例如 login_button 会将 CurrentWidget 更改为 LoginWindow。
When trying to do it myself I ran into recursion problems as I have just started with learning Python.当我自己尝试做这件事时,我遇到了递归问题,因为我刚刚开始学习 Python。

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys

class ApplicationWindow(QWidget):

def __init__(self):
    super(ApplicationWindow, self).__init__()
    # stack = Controller()
    self.menu = MenuWindow()
    self.login = LoginWindow()

    self.setGeometry(0, 0, 800, 600)
    self.setWindowTitle('Finance tracker')

    self.setAutoFillBackground(True)
    p = self.palette()
    p.setColor(self.backgroundRole(), Qt.green)
    self.setPalette(p)

    self.stack = QStackedWidget()
    self.stack.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum)
    self.stack.addWidget(self.menu)
    self.stack.addWidget(self.login)
    self.stack.setCurrentWidget(self.menu)

    layout = QVBoxLayout()
    layout.addWidget(self.stack)
    layout.setAlignment(Qt.AlignCenter)
    self.setLayout(layout)

class MenuWindow(QWidget):

def __init__(self):
    super(MenuWindow, self).__init__()
    self.setGeometry(0, 0, 250, 200)
    box = QVBoxLayout()

    self.setAutoFillBackground(True)
    p = self.palette()
    p.setColor(self.backgroundRole(), Qt.red)
    self.setPalette(p)

    label = QLabel('Welcome to finance tracker')
    label.setStyleSheet('font: 24pt')
    box.addWidget(label, alignment=Qt.AlignCenter)

    login_button = QPushButton('Login')
    login_button.clicked.connect(qApp.exit)

    new_button = QPushButton('Create a new account')
    new_button.clicked.connect(qApp.exit)

    exit_button = QPushButton('Exit')
    exit_button.clicked.connect(qApp.exit)

    for button in [login_button, new_button, exit_button]:
        button.setStyleSheet('font: 14pt')
        button.setFixedSize(200, 50)
        box.addWidget(button, alignment=Qt.AlignCenter)

    self.setLayout(box)
    self.show()

class LoginWindow(QWidget):

def __init__(self):
    super(LoginWindow, self).__init__()
    self.setGeometry(0, 0, 10, 250)

    self.setAutoFillBackground(True)
    p = self.palette()
    p.setColor(self.backgroundRole(), Qt.blue)
    self.setPalette(p)

    label = QLabel('Welcome to finance tracker')
    box = QVBoxLayout()
    box.addWidget(label)
    self.setLayout(box)
    self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = ApplicationWindow()
    window.show()
    sys.exit(app.exec())

Since you are using QPushButtons to switch pages I would add them to a QButtonGroup.由于您使用 QPushButtons 来切换页面,因此我会将它们添加到 QButtonGroup。 This way you can connect the QButtonGroup.buttonClicked[int] signal to QStackedWidget.setCurrentIndex .这样,您可以将QButtonGroup.buttonClicked[int]信号连接到QStackedWidget.setCurrentIndex Keep a pointer to the QButtonGroup in your MenuWindow.在 MenuWindow 中保留指向 QButtonGroup 的指针。

class MenuWindow(QWidget):

    def __init__(self):
        ...
        login_button = QPushButton('Login')
        new_button = QPushButton('Create a new account')

        exit_button = QPushButton('Exit')
        exit_button.clicked.connect(qApp.exit)

        self.btn_group = QButtonGroup()
        for i, button in enumerate([login_button, new_button, exit_button]):
            button.setStyleSheet('font: 14pt')
            button.setFixedSize(200, 50)
            box.addWidget(button, alignment=Qt.AlignCenter)
            self.btn_group.addButton(button)
            self.btn_group.setId(button, i + 1)
        ...

And now you can connect the signal and slot in your ApplicationWindow.现在您可以在 ApplicationWindow 中连接信号和插槽。

class ApplicationWindow(QWidget):

    def __init__(self):
        ...
        self.menu.btn_group.buttonClicked[int].connect(self.stack.setCurrentIndex)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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