【问题标题】:Commit QSqlRelationalTableModel model changes to database将 QSqlRelationalTableModel 模型更改提交到数据库
【发布时间】:2018-07-13 16:35:25
【问题描述】:

我已经修改了关系表模型 https://doc.qt.io/qt-5/qtsql-relationaltablemodel-relationaltablemodel-cpp.html

我希望能够将我的更改保存到我的数据库中,但它只保存前两列,而不是主键查找行。另外,我无法删除行。我已经搜索过,但没有找到有关如何执行此操作的任何信息。我做错了什么?

我使用的样本数据是:

CREATE TABLE `category` ( `Id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `DrinkType` TEXT NOT NULL);
INSERT INTO `category` VALUES (1,'Non-alcoholic');
INSERT INTO `category` VALUES (2,'Alcoholic');
CREATE TABLE "drinks" ( `Id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `Name` TEXT NOT NULL, `Type` INTEGER );
INSERT INTO `drinks` VALUES (1,'Coca Cola',1);
INSERT INTO `drinks` VALUES (2,'Pilsner',2);

我的代码:

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

def delRecord():
    model.removeRow(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.OnManualSubmit)
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_())

【问题讨论】:

    标签: python pyqt pyqt5 qsqltablemodel qsqlrelationaltablemodel


    【解决方案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_())
    

    【讨论】:

    • 祝福!非常感谢。
    猜你喜欢
    • 2012-01-08
    • 1970-01-01
    • 2013-12-20
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    相关资源
    最近更新 更多