PyQt中保存Y-Number输入值并过滤AP下拉框选项问题
问题描述
我想用Y-Number输入框的内容过滤AP下拉框(APComboBox)的选项,但目前无法保存Y-Number输入框(带自动补全的QLineEdit)的当前值,期望选中Y-Number后,AP版本下拉框自动加载对应过滤后的版本值。相关代码如下:
class Window(QWidget): def updateyNumber(self): print(str(self.APComboBox.currentText())) if self.yNumberComboBox != "": for i in range(len(responsesDecoded_GetAllVersionPB)): if self.yNumberComboBox.text() == responsesDecoded_GetAllVersionPB[i]['YNumber']: y = responsesDecoded_GetAllVersionPB[i]['Version'] All_Ynumbers_Version.append([y]) else: #♣print("none y combo") if self.yNumberComboBox.text() != None: print("y num came: {0}".format(self.yNumberComboBox.text())) versionss = np.unique(All_Ynumbers_Version) self.APComboBox.addItems(versionss) def __init__(self): super(Window, self).__init__() # setting window title self.setWindowTitle("FastFEM 4.1") # setting geometry to the window self.setGeometry(100, 100, 300, 400) # creating a group box self.formGroupBox = QGroupBox() info = ["MSD", "Custom", "Qstat", "Test", "Admin"] # completer completeryNum = QCompleter(yNumbers) # creating combo box to select yNumber self.yNumberComboBox = QLineEdit() self.yNumberComboBox.setCompleter(completeryNum) #self.yNumberComboBox.currentTextChange.connect(self.updateyNumberComboBox) # creating combo box to select AP/Ti self.APComboBox = QComboBox() self.updateyNumber() # adding version items to the combo box #self.APComboBox.addItems(versionss) self.APComboBox.currentTextChanged.connect(self.updateyNumber) self.model = QStandardItemModel() # creating combo box to select FastFEM Criteria self.FastFEMComboBox = QComboBox() # adding criteria items to the combo box self.FastFEMComboBox.addItems(info) # creating a line edit self.PRVPressure = QLineEdit() self.NeedForce = QLineEdit() # calling the method that create the form self.createForm() # creating a vertical layout mainLayout = QVBoxLayout() # adding form group box to the layout mainLayout.addWidget(self.formGroupBox) # setting lay out self.setLayout(mainLayout) # get info method called when form is accepted def getInfo(self): # printing the form information print("Y-Number : {0}".format(self.yNumberComboBox.text())) print("AP/Ti : {0}".format(self.APComboBox.currentText())) print("FastFEM Criteria : {0}".format(self.FastFEMComboBox.currentText())) print("Prv Pressure (bar) : {0}".format(self.PRVPressure.text())) print("Needle Force (N) : {0}".format(self.NeedForce.text())) # clear the table self.yNumberComboBox.clear() self.APComboBox.clear() self.FastFEMComboBox.clear() self.PRVPressure.clear() self.NeedForce.clear() # closing the window #self.close() # creat form method def createForm(self): # creating a form layout layout = QFormLayout() # adding rows # for yNumber and adding combo box layout.addRow(QLabel("Y-Number"), self.yNumberComboBox) # for APP/Ti and adding combo box layout.addRow(QLabel("AP/Ti"), self.APComboBox) # for FastFEM Criteria adding combo box layout.addRow(QLabel("FastFEM Criteria"), self.FastFEMComboBox) # for PRV Pressure adding input variable layout.addRow(QLabel("PRV Pressure (bar)"), self.PRVPressure) # for Needle Force adding input variable layout.addRow(QLabel("Needle Force (N)"), self.NeedForce) # start fastFEM and cancel buttons startButton = QPushButton("Cancel") startButton.clicked.connect(self.cancelClicked) cancelButton = QPushButton("Start FastFEM") cancelButton.clicked.connect(self.getInfo) layout.addRow(startButton, cancelButton) # setting layout self.formGroupBox.setLayout(layout) return self.yNumberComboBox.text() #def closeEvent(self, event): # reply = QMessageBox.question(self, 'Window Close', 'Are you sure you want to close the window', # QMessageBox.Yes | QMessageBox.No, QMessageBox.No) # # if reply == QMessageBox.Yes: # event.accept() # # else: # event.ignore() def cancelClicked(self): QtCore.QCoreApplication.instance().quit() def saveClick(self): self.APComboBox.currentTextChanged.connect(self.updateyNumberComboBox)
解决方案
要实现Y-Number输入变化时自动过滤AP下拉框,需修改以下关键逻辑:
- 绑定正确的信号:将Y-Number输入框的
textChanged信号绑定到AP下拉框的更新方法,而非原代码中绑定AP下拉框的信号到更新方法。 - 修复值判断逻辑:原代码中
if self.yNumberComboBox != "":是错误的,应判断输入框的文本内容self.yNumberComboBox.text().strip()。 - 避免数据残留:每次更新AP选项前先清空下拉框,并且不要使用全局列表存储版本,每次过滤都重新生成数据。
- 优化过滤逻辑:直接遍历数据源筛选匹配的版本,无需多余分支判断。
修改后的完整代码:
import numpy as np from PyQt5.QtWidgets import (QWidget, QGroupBox, QCompleter, QLineEdit, QComboBox, QStandardItemModel, QFormLayout, QLabel, QPushButton, QVBoxLayout) import PyQt5.QtCore as QtCore # 假设这两个变量是已定义的全局数据 responsesDecoded_GetAllVersionPB = [] yNumbers = [] class Window(QWidget): def updateAPOptions(self): # 获取当前Y-Number输入值,去除首尾空格 current_y_num = self.yNumberComboBox.text().strip() self.APComboBox.clear() if not current_y_num: # 如果Y-Number为空,可选择清空AP下拉框或加载全部版本,这里选择清空 return # 筛选匹配Y-Number的版本 matched_versions = [] for item in responsesDecoded_GetAllVersionPB: if item.get('YNumber') == current_y_num: matched_versions.append(item.get('Version', '')) # 去重并添加到AP下拉框 unique_versions = np.unique(matched_versions).tolist() self.APComboBox.addItems(unique_versions) def __init__(self): super(Window, self).__init__() # 设置窗口标题 self.setWindowTitle("FastFEM 4.1") # 设置窗口大小位置 self.setGeometry(100, 100, 300, 400) # 创建分组框 self.formGroupBox = QGroupBox() info = ["MSD", "Custom", "Qstat", "Test", "Admin"] # 自动补全器 completeryNum = QCompleter(yNumbers) # 创建Y-Number输入框 self.yNumberComboBox = QLineEdit() self.yNumberComboBox.setCompleter(completeryNum) # 绑定文本变化信号到AP选项更新方法 self.yNumberComboBox.textChanged.connect(self.updateAPOptions) # 创建AP/Ti下拉框 self.APComboBox = QComboBox() # 创建FastFEM Criteria下拉框 self.FastFEMComboBox = QComboBox() self.FastFEMComboBox.addItems(info) # 创建其他输入框 self.PRVPressure = QLineEdit() self.NeedForce = QLineEdit() # 创建表单布局 self.createForm() # 主布局 mainLayout = QVBoxLayout() mainLayout.addWidget(self.formGroupBox) self.setLayout(mainLayout) # 获取表单信息方法 def getInfo(self): # 打印表单信息 print("Y-Number : {0}".format(self.yNumberComboBox.text())) print("AP/Ti : {0}".format(self.APComboBox.currentText())) print("FastFEM Criteria : {0}".format(self.FastFEMComboBox.currentText())) print("Prv Pressure (bar) : {0}".format(self.PRVPressure.text())) print("Needle Force (N) : {0}".format(self.NeedForce.text())) # 清空表单 self.yNumberComboBox.clear() self.APComboBox.clear() self.FastFEMComboBox.clear() self.PRVPressure.clear() self.NeedForce.clear() # 创建表单布局 def createForm(self): layout = QFormLayout() # 添加表单行 layout.addRow(QLabel("Y-Number"), self.yNumberComboBox) layout.addRow(QLabel("AP/Ti"), self.APComboBox) layout.addRow(QLabel("FastFEM Criteria"), self.FastFEMComboBox) layout.addRow(QLabel("PRV Pressure (bar)"), self.PRVPressure) layout.addRow(QLabel("Needle Force (N)"), self.NeedForce) # 按钮 startButton = QPushButton("Cancel") startButton.clicked.connect(self.cancelClicked) cancelButton = QPushButton("Start FastFEM") cancelButton.clicked.connect(self.getInfo) layout.addRow(startButton, cancelButton) self.formGroupBox.setLayout(layout) def cancelClicked(self): QtCore.QCoreApplication.instance().quit()
内容的提问来源于stack exchange,提问作者zeynepdilara
相关产品推荐
相关产品推荐

