Расскажу что де как. Авось кому пригодится.
Видимо PyQt и boolean-тип в SQLite дружат очень слабо.
self.is_restriction.stateChanged.connect(
self.check_box_state_changed)
...
def check_box_state_changed(self):
row = self.mapper.currentIndex()
index = self.model.index(row,
IS_QUESTION_RESTRICTION,
QModelIndex())
value = QVariant(0)
if self.sender().isChecked():
print "check box is on"
value = QVariant(1)
# Some strange unholy magic here:
# value = QVariant(0)
self.model.setData(index, value)
if self.model.submitAll():
self.model.database().commit()
Дело в том, что заставить check_box_state_changed работать корректно
невозможно. Я пробовал 3-4 разных реализации. В базу данных ВСЕГДА
будет заносится 1. Хотя если раскомменторовать строку под “Some
strange unholy magic here:”, то, что очевидно, всегда будет заносится
0, при том, что поток выполнения заходит в
if self.sender().isChecked(): именно тогда когда того и этого и
ожидают (на то есть проверочный print).
Иного объяснения, чем “strange unholy magic” у меня нет.
Решение: отказаться от использования типа BOOLEAN в SQLite. Вместо
него использовать VARCHAR(5), с которым будут заносится текстовые
значения “true” и “false”, которые прекрасно работают через
QDataWidgetMapper и QCheckBox, не требуя написания функций установки
значений виджетов и сохранения изменений их состояния в БД вручную.