如何从 SQL 模型中为连接到它的 QListView 选择行
Posted
技术标签:
【中文标题】如何从 SQL 模型中为连接到它的 QListView 选择行【英文标题】:How to select rows from an SQL model for a QListView connected to it 【发布时间】:2010-07-06 22:30:45 【问题描述】:我正在 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
但我想这样,我以后可能会遇到从数据库中选择正确条目的问题。
有什么优雅的方法可以做到这一点吗? 我的第一个想法是将数据库中的最大 id 作为 row_count 返回,然后用虚假数据填充不存在的行并将它们隐藏在视图中。由于应用程序最多必须处理 10k 左右的数据,而这已经非常不太可能,我认为这可能是可行的。
【问题讨论】:
如何删除行?只是在模型之外(所以它们没有显示出来),还是也在数据库之外? 数据库外。但正如我上面所说,从模型中删除它们可能是一个想法 如果我的问题不够清楚,请随时询问更多细节。谢谢大家。 【参考方案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
【讨论】:
以上是关于如何从 SQL 模型中为连接到它的 QListView 选择行的主要内容,如果未能解决你的问题,请参考以下文章
Azure 为连接到 CosmosDB 的标准逻辑应用生成 URL