-
QTableView()视图数据表QSqlTableModel排序后想获得排序前的行索引,以实现只能修改部分行,排序后不影响修改权限: 现在无论如何排序,被限制的model.editableRows = [0,2,4]能跟随排序的变化而变化。
class CustomTableModel(QSqlTableModel): def __init__(self, parent=None, database=None): super(CustomTableModel, self).__init__(parent, database) self.editableRows = [] def setData(self, index, value, role=Qt.EditRole): if index.row() not in self.editableRows or not index.isValid(): # 不允许编辑指定的行 if role == Qt.EditRole: return False return super(CustomTableModel, self).setData(index, value, role) def flags(self, index): flags = super(CustomTableModel, self).flags(index) # model_index = QModelIndex(self.index(index.row(), index.column())) if index.row() not in self.editableRows or not index.isValid(): # 不允许编辑指定的行 flags &= ~Qt.ItemIsEditable return flags class MainApp(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.resize(500, 300) self.table_view = QTableView(self) self.setCentralWidget(self.table_view) db = QSqlDatabase.addDatabase('QSQLITE') db.setDatabaseName('test.db') db.open() #以下为主要代码 model = CustomTableModel(self, db)#将QSqlTableModel替换为继承的类CustomTableModel model.setTable('my_table') model.setEditStrategy(QSqlTableModel.OnManualSubmit) model.select() model.editableRows = [0,2,4] #下面不要直接将数据模型设置给列表视图:self.table_view.setModel(model) proxyModel = QSortFilterProxyModel(self)#先实例化QSortFilterProxyModel方法 proxyModel.setSourceModel(model)#先将数据模型设置为QSortFilterProxyModel的数据 self.table_view.setModel(proxyModel)#再将proxyModel方法设置为列表视图的数据模型
10-14
687
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)