Как выбрать строки из модели SQL для подключенного к ней QListView - PullRequest
2 голосов
/ 07 июля 2010

Я пытаюсь сделать следующее в 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

Проблема заключалась в том, что, как только я начинаю удалять строки, идентификаторы перестают быть последовательными. Итак, мое текущее решение выглядит так:

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

Но я полагаю, что таким образом у меня могут возникнуть проблемы с выбором правильной записи из базы данных позже.

Есть какой-нибудь элегантный способ сделать это? Моей первой идеей было бы вернуть максимальный идентификатор из базы данных как row_count, а затем заполнить несуществующие строки фиктивными данными и скрыть их в представлении. Поскольку приложению, в большинстве случаев, придется обрабатывать что-то около 10 тыс., И это уже очень маловероятно, я думаю, что это может быть осуществимо.

1 Ответ

1 голос
/ 28 июля 2010

Сохраните идентификаторы строк в списке в модели и используйте их в качестве индекса для получения строк базы данных. Если вы хотите реализовать сортировку в системе представления модели, просто отсортируйте список как требуется.

Если вы удалите строку из базы данных напрямую, модель не узнает и не обновит представления. Они будут отображать устаревшие данные и, возможно, также нарушать работу, когда пользователи пытаются редактировать строки, которые больше не существуют в базовой базе данных, что может привести к серьезным ошибкам. Вы можете обойти это, вызывая 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
...