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)