I'm currently writing some code in PyQt4 that takes a value and a control and binds the value to the control. Once the user save the form it will unbind all the values and save it back to custom object (in this case QgsFeature).
So at the moment I have bind and unbind code which uses if/elif to workout the control type and then use the correct methods to bind the value. Like so:
def bindValueToControl(self, control, value):
"""
Binds a control to the supplied value.
Raises BindingError() if control is not supported.
control - QWidget based control that takes the new value
value - A QVariant holding the value
"""
if isinstance(control, QCalendarWidget):
control.setSelectedDate(QDate.fromString(value.toString(), Qt.ISODate))
elif isinstance(control, QListWidget):
items = control.findItems(value.toString(), Qt.MatchExactly)
try:
control.setCurrentItem(items[0])
control.currentItemChanged.emit(None, items[0])
except IndexError:
pass
elif isinstance(control, QLineEdit) or isinstance(control, QTextEdit):
control.setText(value.toString())
elif isinstance(control, QCheckBox) or isinstance(control, QGroupBox):
control.setChecked(value.toBool())
elif isinstance(control, QPlainTextEdit):
control.setPlainText(value.toString())
elif isinstance(control, QComboBox):
# Add items stored in the database
query = QSqlQuery()
query.prepare("SELECT value FROM ComboBoxItems WHERE control = :contorl")
query.bindValue(":control", control.objectName())
query.exec_()
while query.next():
newvalue = query.value(0).toString()
if not newvalue.isEmpty():
control.addItem(newvalue)
itemindex = control.findText(value.toString())
if itemindex == -1:
control.insertItem(0,value.toString())
control.setCurrentIndex(0)
else:
control.setCurrentIndex(itemindex)
elif isinstance(control, QDoubleSpinBox):
double, passed = value.toDouble()
control.setValue(double)
elif isinstance(control, QSpinBox):
integer, passed = value.toInt()
control.setValue(integer)
else:
raise BindingError(control, value.toString(), "Unsupported widget %s" % control)
for unbind:
def unbindFeature(self, qgsfeature):
"""
Unbinds the feature from the form saving the values back to the QgsFeature.
"""
for index, control in self.fieldtocontrol.items():
value = None
if isinstance(control, QLineEdit):
value = control.text()
elif isinstance(control, QTextEdit) or isinstance(control, QPlainTextEdit):
value = control.toPlainText()
elif isinstance(control, QCalendarWidget):
value = control.selectedDate().toString(Qt.ISODate)
elif isinstance(control, QCheckBox) or isinstance(control, QGroupBox):
value = 0
if control.isChecked():
value = 1
elif isinstance(control, QComboBox):
value = control.currentText()
if control.isEditable():
self.saveComboValues(control, value)
elif isinstance(control, QDoubleSpinBox) or isinstance(control, QSpinBox):
value = control.value()
elif isinstance(control, QDateTimeEdit):
value = control.dateTime().toString(Qt.ISODate)
elif isinstance(control, QListWidget):
item = control.currentItem()
if item:
value = item.text()
else:
return QString("")
I can't help but feel this is a little dirty looking. Is there a nicer, more maintainable, way to handle something like this.