Search code examples
pythonpyqtpyqt5qstackedwidgetqtoolbutton

How to connect Qtoolbutton and QStackedWidget (Both are in same frame)


MainWindow

I created a Window in which there are 4 different QToolButtons and it is outside QStackedWidget. When I click on the first QToolButton which is Balance Inquiry as shown in the image then the contents of Balance Inquiry should be shown and similarly for the rest of the QToolButtons. Both of them are in the same frame.

I don't know how to connect. I'm learning PyQt5. I'm just using the designer and have a very basic idea about the coding in PyQt5.

GitHub repository link is : https://github.com/abhi7585/Bank-of-Braavos


Solution

  • Since you do not provide an MRE then I will provide a solution from scratch.

    The solution is to use QButtonGroup where the buttons associated with ids are added, and then use the buttonClicked signal that will send the information of the id of the pressed button that should be set as currentIndex of the QStackedWidget.

    import sys
    
    from PyQt5 import QtCore, QtWidgets
    
    
    class MainWindow(QtWidgets.QMainWindow):
        def __init__(self, parent=None):
            super().__init__(parent)
    
            self.title_label = QtWidgets.QLabel(
                "BANK OF BRAAVOS", alignment=QtCore.Qt.AlignCenter
            )
    
            self.balance_inquiry_button = QtWidgets.QToolButton(text="Balance Inquiry")
            self.transaction_button = QtWidgets.QToolButton(text="Transaction")
            self.balance_sheet_button = QtWidgets.QToolButton(text="Balance Sheet")
            self.support_button = QtWidgets.QToolButton(text="Support")
    
            self.stacked_widget = QtWidgets.QStackedWidget()
    
            self.stacked_widget.addWidget(
                QtWidgets.QLabel("Balance Inquiry", alignment=QtCore.Qt.AlignCenter)
            )
            self.stacked_widget.addWidget(
                QtWidgets.QLabel("Transaction", alignment=QtCore.Qt.AlignCenter)
            )
            self.stacked_widget.addWidget(
                QtWidgets.QLabel("Balance Sheet", alignment=QtCore.Qt.AlignCenter)
            )
            self.stacked_widget.addWidget(
                QtWidgets.QLabel("Support", alignment=QtCore.Qt.AlignCenter)
            )
    
            central_widget = QtWidgets.QWidget()
            self.setCentralWidget(central_widget)
            lay = QtWidgets.QVBoxLayout(central_widget)
            lay.addWidget(self.title_label)
    
            hlay = QtWidgets.QHBoxLayout()
            hlay.addWidget(self.balance_inquiry_button)
            hlay.addWidget(self.transaction_button)
            hlay.addWidget(self.balance_sheet_button)
            hlay.addWidget(self.support_button)
            lay.addLayout(hlay)
            lay.addWidget(self.stacked_widget)
    
            self.group_button = QtWidgets.QButtonGroup()
            for i, button in enumerate(
                (
                    self.balance_inquiry_button,
                    self.transaction_button,
                    self.balance_sheet_button,
                    self.support_button,
                )
            ):
                self.group_button.addButton(button, i)
    
            self.group_button.buttonClicked[int].connect(
                self.stacked_widget.setCurrentIndex
            )
    
            self.resize(640, 480)
    
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        ex = MainWindow()
        ex.show()
        sys.exit(app.exec_())