signal index currentindexchanged python python-3.x pyqt pyqt5 qcombobox

python - index - ¿Cómo puedo cambiar el contenido de un QComboBox dependiendo de otro QComboBox en PyQt5?



qcombobox signal (1)

Escribo el programa en python3 que calculará las propiedades termodinámicas. Esta es una pieza de GUI

"Выбранное вещество" es una sustancia seleccionada como 1-buteno, agua, amoniaco, etc.

"Первый параметр" es un primer parámetro. El usuario elegirá parámetros como presión, temperatura, densidad, etc., y una unidad de medida como Pa, MPa, barra (si es presión) y etc. Así que no sé una cosa: quiero que si el usuario elige la presión (''Давление (P) '') en el cuadro combinado superior, dependiendo de esto, se eligieron unidades de medida adecuadas en un pequeño cuadro combinado.

Qué he hecho ya: crear 2 archivos

  • testGUI.py - hay toda la GUI (creo en Qt Designer)
  • CalcProp.py - hay toda la lógica del programa (clases y funciones)

Entonces en CalcProp.py escribí una clase que contiene una función que devuelve la lista de parámetros:

class ChooseParams(): def paramList(self): P = ''Pressure (P)'' T = ''Temperature (T)'' D = ''Density (D)'' V = ''Volume (V)'' H = ''Enthalpy (h)'' S = ''Entropy (s)'' Q = ''Vapor quality (x)'' allParams = [P, T, D, V, H, S, Q] return allParams

Después de que creé la clase que contiene la función que selecciona la unidad de medidas:

class ChooseUnitOfMeasurement(): def unitOfMeasurement(self, parameter): #Pressure Pa = ''Па'' kPa = ''кПа'' MPa = ''МПа'' PressureUnitList = [Pa, kPa, MPa] #Temperature kelvin = ''К'' degC = ''°C'' degF = ''°F'' tempUnitList = [kelvin, degC, degF] #Enthalpy kJdivKg = ''кДж/кг'' JdivKg = ''Дж/кг'' enthalpyUnitList = [kJdivKg, JdivKg] #Entropy kJdivKgKel = ''кДж/(кг-К)'' JdivKgKel = ''Дж/(кг-К)'' entropyUnitList = [kJdivKgKel, JdivKgKel] #Density kgDivMeter = ''кг/м^3'' #Volume meterDivKg = ''м^3/кг'' #Vapor quality vaporQuality = ''--'' if parameter == ''Pressure (P)'': return PressureUnitList elif parameter == ''Temperature (T)'': return tempUnitList elif parameter == ''Density (D)'': return kgDivMeter elif parameter == ''Volume (V)'': return meterDivKg elif parameter == ''Enthalpy (h)'': return enthalpyUnitList elif parameter == ''Entropy (s)'': return entropyUnitList else: return vaporQuality

en testGUI.py

#Creation combobox for selection first parameter self.comboBoxInputFirstParam = QtWidgets.QComboBox(self.groupBoxFirstParam) #put parameters self.comboBoxInputFirstParam.addItems(CalcProp.ChooseParams.paramList(self)) #Creation combobox for selection unit of measurement (first parameter) self.comboBoxInputFirstParamUnit = QtWidgets.QComboBox(self.groupBoxFirstParam) #get text of first combobox firstParameter = self.comboBoxInputFirstParam.currentText() #Depending on the content of the first one, add the required list / value in the combobox with units of measurement. self.comboBoxInputFirstParamUnit.addItems(CalcProp.ChooseUnitOfMeasurement.unitOfMeasurement(self, firstParameter))

Todo funciona, pero solo cuando el programa comienza, cuando cambio la presión a otro valor, la unidad de medida no cambia. Y estoy interesado en cómo cambiar los contenidos de un cuadro combinado dependiendo de otro en tiempo real.


Debes usar la señal currentTextChanged , esto se activa cada vez que eliges un elemento, devolviendo el texto, también debemos validar si se trata de una lista o un elemento individual. Todo lo anterior se implementa en el siguiente código:

[...] self.comboBoxInputFirstParam = QtWidgets.QComboBox(self.groupBoxFirstParam) self.comboBoxInputFirstParamUnit = QtWidgets.QComboBox(self.groupBoxFirstParam) self.comboBoxInputFirstParam.currentTextChanged.connect(self.onCurrentTextChanged) self.comboBoxInputFirstParam.addItems(CalcProp.ChooseParams().paramList()) def onCurrentTextChanged(self, text): self.comboBoxInputFirstParamUnit.clear() elements = CalcProp.ChooseUnitOfMeasurement().unitOfMeasurement(str(text)) if isinstance(elements, list): self.comboBoxInputFirstParamUnit.addItems(elements) else: self.comboBoxInputFirstParamUnit.addItem(elements)