Foo Boy
Foo Boy

Reputation: 9

Dynamically change UI after ComboBox item changing in pyqt

I have an combobox at the top of UI. And I wanna change amount of next widgets after that ComboBox, i.e. rewrite GUI after selecting another item in ComboBox.

class Ui_RegisterWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(620, 492)

        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.comboBox = QtWidgets.QComboBox(self.centralwidget)
        self.comboBox.setObjectName("comboBox")
        self.comboBox.addItem("Worker")
        self.comboBox.addItem("Teacher")
        self.comboBox.addItem("Student")
        self.verticalLayout_2.addWidget(self.comboBox)
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setObjectName("label")
        self.verticalLayout.addWidget(self.label)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setObjectName("label_2")
        self.horizontalLayout.addWidget(self.label_2)
        self.firstNameLine = QtWidgets.QLineEdit(self.centralwidget)
        self.firstNameLine.setObjectName("firstNameLine")
        self.horizontalLayout.addWidget(self.firstNameLine)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setObjectName("label_3")
        self.horizontalLayout_2.addWidget(self.label_3)
        self.secondNameLine = QtWidgets.QLineEdit(self.centralwidget)
        self.secondNameLine.setText("")
        self.secondNameLine.setObjectName("secondNameLine")
        self.horizontalLayout_2.addWidget(self.secondNameLine)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setObjectName("label_4")
        self.horizontalLayout_3.addWidget(self.label_4)
        self.instituteLine = QtWidgets.QLineEdit(self.centralwidget)
        self.instituteLine.setText("")
        self.instituteLine.setObjectName("instituteLine")
        self.horizontalLayout_3.addWidget(self.instituteLine)
        self.verticalLayout.addLayout(self.horizontalLayout_3)
        self.verticalLayout_2.addLayout(self.verticalLayout)
        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout_2.addItem(spacerItem)
        self.registerButton = QtWidgets.QPushButton(self.centralwidget)
        self.registerButton.setObjectName("registerButton")
        self.verticalLayout_2.addWidget(self.registerButton)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 620, 17))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.toolBar = QtWidgets.QToolBar(MainWindow)
        self.toolBar.setObjectName("toolBar")
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)

        # connect to slots
        self.registerButton.clicked.connect(self.Register)

        self.comboBox.currentTextChanged.connect(self.ChangeUi)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "RegisterStudentWindow"))
        self.label.setText(_translate("MainWindow", "Fill in registration blank"))
        self.label_2.setText(_translate("MainWindow", "First name"))
        self.firstNameLine.setPlaceholderText(_translate("MainWindow", "e.g. Sam"))
        self.label_3.setText(_translate("MainWindow", "Surname"))
        self.secondNameLine.setPlaceholderText(_translate("MainWindow", "e.g. Snow"))
        self.label_4.setText(_translate("MainWindow", "Department"))
        self.instituteLine.setPlaceholderText(_translate("MainWindow", "e.g. IKNI"))
        self.registerButton.setText(_translate("MainWindow", "Register"))
        self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar"))

    def ChangeUi(self):
        currentItem = self.comboBox.currentText()
        #implement changing ui logic

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_RegisterWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

For example if I choose Worker I want to see fileds for inputs for First name, Second name and Department. If it was Student I expect to see fields for First name, Second name and Group name.

How should I get it?

Upvotes: 0

Views: 2643

Answers (1)

C.Cheung
C.Cheung

Reputation: 31

Looks like you got your Ui_RegisterWindow class generated from .ui file. Do not rewrite the generated file directly cause all changes you made will be lost when you modify the ui file and regenerate. You can just subclass it in your gui class and reference the widgets to modify them. e.g.

class Gui(QMainWindow, Ui_RegisterWindow):
    def __init__(self):
        super(Gui, self).__init__()
        self.setupUi(self)
        self.comboBox.currentTextChanged.connect(self.do_something)

    def do_something(self):
        # do something here


if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = Gui()
    win.show()
    sys.exit(app.exec_())

For the changing ui logic:

  1. You can try QStackedWidget. Add different widgets in different pages of the stackedwidget, and set current page to according to the content of your combobox.
    def do_something(self):
        self.stackedwidget.setCurrentIndex(self.comboBox.currentIndex())
  1. If you only want different text on labels, you can just reference it and setText.

Upvotes: 2

Related Questions