You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:05:14