QSqlQueryModel
は優れたデータベースモデルですが、読み取り専用です。setData()
だから私はそのandflags()
メソッドを書き直します。これで、データベーステーブルを次の場所から編集できます。QTableView
しかし、QTableViewはdataChanged()
、を発行したときに自動的に更新されません。でテキストボックスを編集しQTableView
て別の場所をクリックすると、新しい値がデータベースに正常に書き込まれましたが、テキストボックスの値は古い値に戻りました。テーブル全体を再選択する必要があり、パフォーマンスが非常に悪くなりました...
なんで?
class StudentsTableModel(QtSql.QSqlQueryModel):
def __init__(self):
QtSql.QSqlQueryModel.__init__(self)
self.LockedColumns = []
def flags(self, index):
flags = QtSql.QSqlQueryModel.flags(self, index)
if index.column() not in self.LockedColumns:
flags |= QtCore.Qt.ItemIsEditable
return flags
def setData(self, index, value, role):
primary_key_index = self.index(index.row(), 0)
name = self.data(primary_key_index)
field = self.record().fieldName(index.column())
self.update(name, field, value)
self.dataChanged.emit(self.index, self.index)
# Why DataView isn't refresh automatically when
# a dataChanged signal emited? Force re-select...
self.select(self.week)
return True
def update(self, name, field, value):
query = QtSql.QSqlQuery()
sql = ("UPDATE student_info SET '%s' = '%s' WHERE 学生姓名 = '%s'"
% (field, value, name))
query.exec(sql)
def select(self, week):
self.week = week
sql = ("SELECT 学生姓名,第%s周,小组 FROM student_info" % (week))
self.setQuery(sql)