Модель / представление PyQt: какой тип модели для программных изменений? - PullRequest
0 голосов
/ 07 мая 2011

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

До сих пор мне удавалось успешно сделать модель только для чтения.наследование от QAbstractTableModel.Эта модель выглядит примерно так:

class MyModel(QtCore.QAbstractTableModel):
    def __init__(self, data, parent=None):
        super(MyModel, self).__init__(parent)
        self.data = data

data - это список, содержащий ряд объектов.Затем они доступны в методе data ():

   def data(self, index, role):

       # much stuff omitted for clarity
       return QtCore.QVariant(self.data[index.column()].id)

Теперь это нормально, если я работаю с предопределенным элементом data.Но на самом деле data изменяется программно (расширяется при получении определенных сигналов).Как я могу держать модель в курсе этого, чтобы мой взгляд также мог реагировать на эти изменения?

Я читал о моделях чтения-записи, но они также позволяют пользователю редактировать и изменять вещи,в то время как, на мой взгляд, я хочу, чтобы все было недоступно для редактирования: короче говоря, модель нужно было бы менять только «за кулисами», и представление адаптировалось бы к этому.

Каков лучший подход приложения в этомдело?Реализовать модель чтения-записи с помощью setData () и т. Д., Или есть более простое решение?

Ответы [ 2 ]

1 голос
/ 07 мая 2011

My logview приложение использует QAbstractTableModel с динамическим списком - записей журнала, который динамически увеличивается при получении записей по сети. Вы можете скачать исходный код и взглянуть на LogRecordModel, который является подклассом QAbstractTableModel, как и PropertySheetModel. Обе модели предназначены только для чтения.

Это довольно простое приложение, использующее API модели / представления Qt, поэтому вы должны иметь возможность адаптировать его методы для своего собственного приложения.

1 голос
/ 07 мая 2011

На самом деле, это немного сложнее, чем вы, вероятно, надеялись.Вы должны сообщить своему мнению, когда таблица расширяется или сокращается.Поскольку представление обновляет элементы только на локальной основе, когда они изменяются, оно должно быть проинформировано об изменении формы таблицы.

Итак, вы должны использовать beginInsertRows () и beginRemoveRows () (и их аналоги для столбцов) при изменении формы таблицы.

См. this и this для получения дополнительной информации.

Метод setData вызывается всякий раз, когда пользователь изменяет редактируемый индекс.

Программирование модели / представления может быть немного сложным, но оно приносит большие дивиденды (если все сделано правильно) с точки зрения стабильности,интерактивность, масштабируемость и возможность повторного использования.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...