Найти - Пользователи
Полная версия: PyQt: QDataWidgetMapper не работает с QCheckBox
Начало » GUI » PyQt: QDataWidgetMapper не работает с QCheckBox
1
kostafey
После того как к QDataWidgetMapper-у подключить QCheckBox:
self.is_restriction = QCheckBox()
self.mapper.addMapping(self.is_restriction, IS_QUESTION_RESTRICTION)
...
self.name_edit = QLineEdit()
self.mapper.addMapping(self.name_edit, NAME)
...
mapper перестает сохранять изменения в БД. Т.е. после выполнения сохранения:
self.mapper.submit()
изменения в любых других виджетах (например, self.name_edit), привязанных к этому
mapper-у отображаются в модели, но не сохраняются в БД.

Если строку
self.mapper.addMapping(self.is_restriction, IS_QUESTION_RESTRICTION)
закомментировать, все работает отлично. Кто-нибудь сталкивался с подобным?
Есть идеи относительно решения проблемы?
kostafey
Расскажу что де как. Авось кому пригодится.
Видимо 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, не требуя написания функций установки
значений виджетов и сохранения изменений их состояния в БД вручную.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB