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_())

0 ответов

Другие вопросы по тегам