在pyqt中ComboBox项目更改后动态更改UI
Posted
技术标签:
【中文标题】在pyqt中ComboBox项目更改后动态更改UI【英文标题】:Dynamically change UI after ComboBox item changing in pyqt 【发布时间】:2020-09-04 04:39:45 【问题描述】:我在 UI 顶部有一个组合框。我想在 ComboBox 之后更改下一个小部件的数量,即在 ComboBox 中选择另一个项目后重写 GUI。
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_())
例如,如果我选择 Worker,我想查看 First name、Second name 和 Department 的输入文件。如果是 Student,我希望看到 First name、Second name 和 Group name 字段。
我应该如何获得它?
【问题讨论】:
【参考方案1】:看起来你的 Ui_RegisterWindow 类是从 .ui 文件生成的。不要直接重写生成的文件,因为修改ui文件并重新生成时所做的所有更改都会丢失。 您可以在您的 gui 类中对其进行子类化并引用小部件来修改它们。 例如
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_())
对于不断变化的 ui 逻辑:
-
你可以试试 QStackedWidget。在stackedwidget的不同页面中添加不同的widget,并根据你的combobox的内容设置当前页面。
def do_something(self):
self.stackedwidget.setCurrentIndex(self.comboBox.currentIndex())
-
如果您只想在标签上使用不同的文本,您可以引用它并设置文本。
【讨论】:
以上是关于在pyqt中ComboBox项目更改后动态更改UI的主要内容,如果未能解决你的问题,请参考以下文章