Python PyQt-QTableView不响应数据更改信号?
QSqlQueryModel是一个很棒的数据库模型,但它是只读的。所以我重写了它的setData和flags方法。现在,我可以从QTableView编辑我的数据库表了 但是,当我发出一个dataChanged时,QTableView不会刷新自身。当我在QTableView中编辑一个文本框并单击其他位置时,新值成功写入数据库,但文本框的值恢复为旧值。我不得不重新选择整张桌子,结果表现很差 为什么?Python PyQt-QTableView不响应数据更改信号?,python,qt,user-interface,qt4,pyqt,Python,Qt,User Interface,Qt4,Pyqt,QSqlQueryModel是一个很棒的数据库模型,但它是只读的。所以我重写了它的setData和flags方法。现在,我可以从QTableView编辑我的数据库表了 但是,当我发出一个dataChanged时,QTableView不会刷新自身。当我在QTableView中编辑一个文本框并单击其他位置时,新值成功写入数据库,但文本框的值恢复为旧值。我不得不重新选择整张桌子,结果表现很差 为什么? 查看此模型是否适用于您: class sqlTableModel(QSqlTableModel):
查看此模型是否适用于您:
class sqlTableModel(QSqlTableModel):
def __init__(self, parent=None):
super(sqlTableModel, self).__init__(parent)
def setData(self, index, value, role=Qt.EditRole):
if role == Qt.EditRole:
value = value.strip() if type(value) == str else value
return super(sqlTableModel, self).setData(index, value, role)
def flags(self, index):
itemFlags = super(sqlTableModel, self).flags(index)
if index.column() != 0:
return itemFlags | Qt.ItemIsEditable
return itemFlags ^ Qt.ItemIsEditable # First column not editable
要设置表,而不是setQuery,我将在主类中使用如下内容:
def setDatabase(self, nameDatabase):
self.database = QSqlDatabase.addDatabase("QSQLITE")
self.database.setDatabaseName(nameDatabase)
return self.database.open()
def setTable(self, nameTable):
self.model = sqlTableModel(self)
self.model.setEditStrategy(QSqlTableModel.OnManualSubmit)
self.model.setTable(nameTable)
self.model.select()
self.view.setModel(self.model)
def saveTable(self):
if self.model.submitAll():
return True
self.model.database().rollback()
return False
我一张嘴就试过了,但是。。。由于某些原因,我不能使用它,我必须使用非常复杂的SQL,请忘记它。
def setDatabase(self, nameDatabase):
self.database = QSqlDatabase.addDatabase("QSQLITE")
self.database.setDatabaseName(nameDatabase)
return self.database.open()
def setTable(self, nameTable):
self.model = sqlTableModel(self)
self.model.setEditStrategy(QSqlTableModel.OnManualSubmit)
self.model.setTable(nameTable)
self.model.select()
self.view.setModel(self.model)
def saveTable(self):
if self.model.submitAll():
return True
self.model.database().rollback()
return False