Как настроить связь между двумя полями в GUI
Нужно настроить связь между двумя полями. Например, если содержимое поля type != fixedValue, то скрывать поле value, или делать его неактивным.
Как это реализовать?
import sys
from PyQt5.QtGui import QDoubleValidator
from PyQt5.QtWidgets import QApplication, QLabel, QLineEdit, QHBoxLayout, QComboBox, QVBoxLayout, QFormLayout, QWidget
class BlockPU(QWidget):
def __init__( self):
super().__init__()
self.block_pU_form = QFormLayout()
self.setLayout(self.block_pU_form)
self.block_pU_form.setSpacing(70)
self.block_pU_form.setVerticalSpacing(20)
tophbox = QHBoxLayout()
tophbox.addWidget(QLabel("Pressure (m2/c2)"))
tophbox.addWidget(QLabel("Velocity (m/c)"))
self.block_pU_form.addRow("Patch", tophbox)
for row in range(1, 7):
patch_hbox = QHBoxLayout()
patch_hbox.setSpacing(50)
tv_vbox =QVBoxLayout()
tv_vbox.setSpacing(2)
tv_vbox.addWidget(QLabel("type"))
tv_vbox.addWidget(QLabel("value"))
patch_hbox.addLayout(tv_vbox)
p_tv_vbox = QVBoxLayout()
p_tv_vbox.setSpacing(2)
ptype = QComboBox()
ptype.addItems(["empty", "fixedValue", "noSlip"])
pvalue = QLineEdit()
pvalue.setValidator(QDoubleValidator(-999999, 999999, 50))
p_tv_vbox.addWidget(ptype)
p_tv_vbox.addWidget(pvalue)
patch_hbox.addLayout(p_tv_vbox)
U_tv_vbox = QVBoxLayout()
U_tv_vbox.setSpacing(2)
Utype = QComboBox()
Utype.addItems(["zeroGradient", "fixedValue"])
Uvalue = QHBoxLayout()
xU = QLineEdit()
yU = QLineEdit()
zU = QLineEdit()
xU.setValidator(QDoubleValidator(-999999, 999999, 50))
yU.setValidator(QDoubleValidator(-999999, 999999, 50))
zU.setValidator(QDoubleValidator(-999999, 999999, 50))
Uvalue.addWidget(xU)
Uvalue.addWidget(yU)
Uvalue.addWidget(zU)
U_tv_vbox.addWidget(Utype)
U_tv_vbox.addLayout(Uvalue)
patch_hbox.addLayout(U_tv_vbox)
self.block_pU_form.addRow(QLabel(""), patch_hbox)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
main = BlockPU()
sys.exit(app.exec_())
Ответы (2 шт):
Автор решения: Alexander Chernin
→ Ссылка
После блока кода:
ptype = QComboBox()
ptype.addItems(["empty", "fixedValue", "noSlip"])
pvalue = QLineEdit()
pvalue.setValidator(QDoubleValidator(-999999, 999999, 50))
Добавьте вот эти пару строк:
# Сигнал о выборе другого значения в комбобоксе
ptype.currentTextChanged.connect(lambda text, edt=pvalue: edt.setEnabled( text == "fixedValue"))
# Установим изначальную доступность pvalue
pvalue.setEnabled(ptype.currentText() == "fixedValue")
Автор решения: S. Nick
→ Ссылка
Как вариант
import sys
from PyQt5.QtGui import QDoubleValidator
from PyQt5.QtWidgets import QApplication, QLabel, QLineEdit, QHBoxLayout, QComboBox, QVBoxLayout, QFormLayout, QWidget
class BlockPU(QWidget):
def __init__( self):
super().__init__()
self.block_pU_form = QFormLayout()
self.setLayout(self.block_pU_form)
self.block_pU_form.setSpacing(70)
self.block_pU_form.setVerticalSpacing(20)
tophbox = QHBoxLayout()
tophbox.addWidget(QLabel("Pressure (m2/c2)"))
tophbox.addWidget(QLabel("Velocity (m/c)"))
self.block_pU_form.addRow("Patch", tophbox)
for row in range(1, 7):
patch_hbox = QHBoxLayout()
patch_hbox.setSpacing(50)
tv_vbox =QVBoxLayout()
tv_vbox.setSpacing(2)
tv_vbox.addWidget(QLabel("type"))
tv_vbox.addWidget(QLabel("value"))
patch_hbox.addLayout(tv_vbox)
p_tv_vbox = QVBoxLayout()
p_tv_vbox.setSpacing(2)
ptype = QComboBox()
ptype.addItems(["empty", "fixedValue", "noSlip"])
pvalue = QLineEdit()
pvalue.setValidator(QDoubleValidator(-999999, 999999, 50))
ptype.currentTextChanged.connect( # +++
lambda text, cb=ptype, le=pvalue: self.on_combobox_func(text, cb, le)) # +++
p_tv_vbox.addWidget(ptype)
p_tv_vbox.addWidget(pvalue)
patch_hbox.addLayout(p_tv_vbox)
U_tv_vbox = QVBoxLayout()
U_tv_vbox.setSpacing(2)
Utype = QComboBox()
Utype.addItems(["zeroGradient", "fixedValue"])
Uvalue = QHBoxLayout()
xU = QLineEdit()
yU = QLineEdit()
zU = QLineEdit()
xU.setValidator(QDoubleValidator(-999999, 999999, 50))
yU.setValidator(QDoubleValidator(-999999, 999999, 50))
zU.setValidator(QDoubleValidator(-999999, 999999, 50))
Uvalue.addWidget(xU)
Uvalue.addWidget(yU)
Uvalue.addWidget(zU)
U_tv_vbox.addWidget(Utype)
U_tv_vbox.addLayout(Uvalue)
patch_hbox.addLayout(U_tv_vbox)
self.block_pU_form.addRow(QLabel(""), patch_hbox)
self.show()
def on_combobox_func(self, text, cb, le): # +++
#print(text, cb, le)
if text == 'fixedValue':
le.setEnabled(False)
else:
le.setEnabled(True)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = BlockPU()
sys.exit(app.exec_())

