我在PyQt4中尝试以下操作,使用SQLAlchemy作为QListView模型的后端。
我的第一个版本看起来像这样:
class Model(QAbstractListModel):
def __init__(self, parent=None, *args):
super(Model, self).__init__(parent, *args)
def data(self, index, role):
if not index.isValid():
return None
if role == QtCore.Qt.DisplayRole:
d = sqlmodel.q.get(index.row()+1)
if d:
return d.data
return None
这就产生了一个问题,即一旦我开始删除行,id就不再是连续的了。 所以我目前的解决方案如下:
class Model(QAbstractListModel):
def __init__(self, parent=None, *args):
super(Model, self).__init__(parent, *args)
def data(self, index, role):
if not index.isValid():
return None
if role == QtCore.Qt.DisplayRole:
dives = Dive.q.all()
if index.row() >= len(dives) or index.row() < 0:
return None
return dives[index.row()].location
但我猜这种方式,我可能会在以后从数据库中选择正确的条目时遇到麻烦。
有一些优雅的方法吗? 我的第一个想法是将db中的最大id作为row_count返回,然后使用伪数据填充不存在的行并将其隐藏在视图中。由于应用程序最多必须处理大约10k的内容,并且已经非常不太可能,我认为这可能是可行的。
答案 0 :(得分:1)
将行ID存储在模型的列表中,并将其用作索引以检索数据库行。如果要在模型 - 视图系统中实现排序,只需将列表排序为需要。
如果直接从数据库中删除一行,模型将不知道,因此不会更新视图。当用户试图编辑底层数据库中不存在的行时,它们将显示陈旧的数据,并可能还会破坏,这可能会变得非常糟糕。你可以通过在模型上调用reset()来解决所有视图。
class Model(QAbstractListModel):
def __init__(self, parent=None, *args):
super(Model, self).__init__(parent, *args)
self.id_list = []
def data(self, index, role):
if not index.isValid():
return None
row_id = self.id_list[index.row()]
if role == QtCore.Qt.DisplayRole:
# query database to retrieve the row with the given row_id