Commit QSqlRelationalTableModel изменяет модель базы данных

Может ли помочь этому ? (Большая путаница «этого» в javascript исходит из того факта, что он вообще не связан с вашим объектом, а с текущей исполняемой областью - это может быть не совсем так, как это работает, но для меня это всегда так, см. статью для полного объяснения)

0
задан eyllanesc 13 July 2018 в 16:57
поделиться

1 ответ

Одна из проблем заключается в том, что вы используете несоответствующую стратегию, если вы используете OnManualSubmit, вы должны вызвать метод submitAll(), чтобы изменения записывались в базу данных, если вы не хотите это делать, это лучше использовать OnRowChange, с этой стратегией изменения будут сделаны, когда после добавления значений давления введите или выберите другую строку.

Если вы хотите удалить строку из базы данных, вы должны использовать deleteRowFromTable(), вы используете removeRow(), но это удаляет только строку в представлении, но не в базе данных, поэтому через мгновение данные обновляются, показывая себе новую строку.

def addRecord():
    model.insertRow(model.rowCount())
    view.scrollToBottom()

def delRecord():
    model.deleteRowFromTable(view.currentIndex().row())
    model.select()

app = QtWidgets.QApplication(sys.argv)

window = QtWidgets.QWidget()
window.setWindowTitle("QRelationalSqlTableModel")

con = QtSql.QSqlDatabase.addDatabase('QSQLITE')
con.setDatabaseName('drinks.db')
con.open()

model = QtSql.QSqlRelationalTableModel(parent = window)
model.setEditStrategy(QtSql.QSqlTableModel.OnRowChange)
model. setTable('drinks')
model.setRelation(2, QtSql.QSqlRelation('category', 'id', 'drinktype'))
model.select()

model.setHeaderData(1, QtCore.Qt.Horizontal, 'Name')
model.setHeaderData(3, QtCore.Qt.Horizontal, 'Type of drink')

vbox = QtWidgets.QVBoxLayout()

view = QtWidgets.QTableView()
view.setModel(model)
view.setItemDelegate(QtSql.QSqlRelationalDelegate(view))
view.hideColumn(0)
view.setColumnWidth(1, 150)
view.setColumnWidth(2, 150)

vbox.addWidget(view)
btnAdd = QtWidgets.QPushButton("&Add record")
btnAdd.clicked.connect(addRecord)
vbox.addWidget(btnAdd)
btnDel = QtWidgets.QPushButton("&Delete record")
btnDel.clicked.connect(delRecord)
vbox.addWidget(btnDel)

window.setLayout(vbox)
window.resize(430, 250)
window.show()
sys.exit(app.exec_())
1
ответ дан eyllanesc 17 August 2018 в 12:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: