[英]How to prevent from inserting new row when item is dropped with QTableWidget in PySide
[英]QSqlTableModel.insertRecord(row, record) not inserting at specified row
使用此處提供的答案,我能夠將記錄插入到我的 QSqlTableModel 中。 雖然這會將記錄附加到末尾(行 = -1)就好了,但更改行不會更改插入記錄的位置。 如何在指定行插入記錄?
import sys
from PySide6.QtWidgets import (QApplication, QMainWindow, QTableView)
from PySide6.QtSql import QSqlDatabase, QSqlTableModel, QSqlQuery
class SQLTableModel(QSqlTableModel):
def __init__(self, parent=None):
super().__init__(parent)
query = QSqlQuery()
query.exec(
"CREATE TABLE table1"
"(id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, "
"type TEXT)"
)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.db = QSqlDatabase.addDatabase("QSQLITE")
self.db.setDatabaseName("SQLTableDatabase.sqlite")
self.db.open()
self.table_view = QTableView()
self.model = SQLTableModel()
self.table_view.setModel(self.model)
self.model.setTable("table1")
for i in range(4):
record = self.model.record()
record.setValue("type", str(i))
self.model.insertRecord(-1, record)
record = self.model.record()
record.setValue("type", "TEST")
self.model.insertRecord(2, record) # Why is this record not inserted at row 2?
self.model.select()
self.setCentralWidget(self.table_view)
app = QApplication(sys.argv)
mainwindow = MainWindow()
mainwindow.show()
sys.exit(app.exec())
由於它們的性質,數據庫沒有在給定索引處插入的概念:記錄總是附加的。
默認的editStrategy
(指示模型何時將更改實際提交到數據庫)是OnRowChange
,並且每當插入新記錄時也會發生這種情況。
結果是當你到達for循環的末尾時,模型已經提交了更改並且新記錄已經插入,所以無論你使用什么row
,數據庫都只能在末尾插入新記錄。
在給定行中插入記錄的唯一(簡單)方法是在先前已插入但尚未提交的情況下執行此操作,並使用OnManualSubmit
策略。
在你的情況下:
class MainWindow(QMainWindow):
def __init__(self):
# ...
self.model = SQLTableModel()
self.model.setTable("table1")
self.model.setEditStrategy(self.model.OnManualSubmit)
# ...
self.model.insertRecord(2, record)
self.model.submitAll()
self.model.select()
self.model.setEditStrategy(self.model.OnRowChange)
這將在第 2 行正確插入最后一條記錄。
但是,如果以前的記錄已經存在於數據庫中(或以前提交過),那么您無能為力,除了重新生成表,或手動UPDATE
從所需行開始的所有記錄,通過“移動”每個記錄的現有數據記錄到下一行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.