如何从连接到它的QListView的SQL模型中选择行

时间:2010-07-06 22:30:46

标签: python qt sqlalchemy pyqt4

我在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的内容,并且已经非常不太可能,我认为这可能是可行的。

1 个答案:

答案 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