QDataWidgetMapper не работает правильно с QSqlTableModel в PyQt, когда setOrientation имеет значение Vertical
У меня странная проблема. Следующий код отлично работает, если я сопоставляю только два виджета с первыми двумя строками таблицы SQLITE ("simpletable"). Виджеты заполняются при запуске, и таблица корректно обновляется, когда я редактирую виджеты, нажимаю кнопку и вызываю mapper.submit().
Тем не менее, как только я отображаю третий виджет, значения виджетов при запуске корректно заполняются, но я получаю ошибку при вызове mapper.submit (), и сопоставления больше не работают.
"simpletable" - это простой набор строк и столбцов с текстовыми значениями:
"simpletable"
a1 b1 c1 d1
a2 b2 c2 d2
a3 b3 c3 d3
Когда ориентация установлена на горизонтальную, столбцы правильно отображаются и все работает нормально. Любые предложения, в чем может быть проблема?
from PyQt4 import QtGui, QtCore, QtSql
import sys
def mapValues(mapper):
if not mapper.submit():
print "error!"
else:
print "ok!"
mapper.toFirst()
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
mw = QtGui.QWidget()
db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName("demo_mapper.db")
if not db.open():
print "did not open"
model = QtSql.QSqlTableModel()
model.setTable("simpletable")
model.select()
model.submitAll()
view = QtGui.QTableView()
view.setModel(model)
mapper = QtGui.QDataWidgetMapper()
mapper.setSubmitPolicy(QtGui.QDataWidgetMapper.ManualSubmit)
mapper.setModel(model)
mapper.setOrientation(QtCore.Qt.Vertical)
mapper.setCurrentIndex(0)
vbox = QtGui.QVBoxLayout()
vbox.addWidget(view)
qlinePropValue_0 = QtGui.QLineEdit()
qlinePropValue_1 = QtGui.QLineEdit()
qlinePropValue_2 = QtGui.QLineEdit()
mapper.addMapping(qlinePropValue_0, 0)
mapper.addMapping(qlinePropValue_1, 1)
### ERROR HAPPENS IF LINE BELOW IS INCLUDED ###
### NO ERROR IF LINE BELOW IS COMMENTED OUT
mapper.addMapping(qlinePropValue_2, 2)
mapper.toFirst()
view = QtGui.QTableView()
view.setModel(model)
vbox.addWidget(qlinePropValue_0)
vbox.addWidget(qlinePropValue_1)
vbox.addWidget(qlinePropValue_2)
mybutton = QtGui.QPushButton()
mybutton.setText("Press Me")
mybutton.clicked.connect(lambda: mapValues(mapper))
vbox.addWidget(mybutton)
mw.setLayout(vbox)
mw.show()
sys.exit(app.exec_())