Python PyQt-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):

QSqlQueryModel是一个很棒的数据库模型,但它是只读的。所以我重写了它的setData和flags方法。现在,我可以从QTableView编辑我的数据库表了

但是,当我发出一个dataChanged时,QTableView不会刷新自身。当我在QTableView中编辑一个文本框并单击其他位置时,新值成功写入数据库,但文本框的值恢复为旧值。我不得不重新选择整张桌子,结果表现很差

为什么?


查看此模型是否适用于您:

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