2017-02-10 1 views
0

Это всего лишь теоретический вопрос, я новичок в PyQT. Я не могу определить классы или примеры кода, которые покажут, как модель обновляет данные (если это делается через Qt)Model-View-Controller: При программировании в Qt модель автоматически обновляет данные?

В настоящее время я понимаю, что программист несет ответственность за запись методов/кода для обновления данные, когда изменения производятся в данных модели.

Правильно ли я?

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

enter image description here

+0

Ответ на этот вопрос зависит от того, используете ли вы пользовательскую модель (aka подкласс одной из базовых моделей Qt) или одну из стандартных, которая поставляется с Qt (например, QStandardItemModel') –

+0

Когда я пытаюсь для определения классов, что означает, что я ищу стандартные классы. Если мы говорим о написании кода для обновления данных, это означает, что по умолчанию стандартные классы этого не делают. – MiniMe

ответ

0

Попробуйте выполнить некоторые из tutorials и посмотрите примеры программ, поставляемых с PyQt или PySide.

Модель - это объект, в котором хранятся данные. Это может быть так же просто, как список строк. Представление - это объект, который отображает данные. Qt предоставляет некоторые стандартные модели для хранения общих типов данных и некоторых стандартных представлений для отображения общих типов данных. Для простых случаев вы можете использовать эти готовые компоненты. Эти компоненты имеют стандартные методы для добавления или удаления данных из модели или обновления представления при изменении модели. Эти изменения распространяются от модели к представлению или из виджетов или элементов управления в модель с использованием сигналов. Благодаря стандартизованному наименованию методов и сигналов это все работает довольно плавно.

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

Далее на комментарий MiniME в:

Давайте посмотрим на примере. Модели Qt имеют метод xx.setData() для обновления элемента данных, который принимает параметры, определяющие, где в модели данные идут (индекс) и новые данные. Когда вы реализуете этот метод, вы выполняете работу по обновлению данных на любой используемый механизм хранения (например, список или словарь) и излучаете сигнал xx.dataChanged(). Если какие-либо взгляды связаны с этой моделью, они будут подписываться на этот сигнал и поэтому автоматически обновятся.

def setData(self, index, value): 
    # Update the data in the underlying python list self.my_list 
    # The index object is of a data type provided by Qt. To perform 
    # this operation we have to extract the row number where the change 
    # is to be made, then use that to update the appropriate entry in 
    # the list. 
    self.my_list[index.row()] = value 

    # Create a PyQt modelIndex object based on the row number that was 
    # updated. The self.index() method is provided by Qt. 
    modelIndex = self.index(index.row()) 

    # Send the modelIndex of the change to any connected views so they 
    # know to update themselves 
    self.dataChanged.emit(modelIndex) 

    # In reality we'd do some validation checks and return False if there 
    # was a problem and the data change didn't happen. 
    return True 

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

+0

Спасибо, Саймон, но ваш ответ объясняет, что я знал.Мне нужно понять, есть ли у Qt какие-либо средства для обновления данных при изменении данных модели, или я должен написать свою собственную модель. То, что вы описываете выше, - это то, как создать модель и представление, которое мне не нужно понимать. – MiniMe

+0

Я обновил свой вопрос с изображением. Я все еще верю, что ваш ответ не касается моего вопроса. – MiniMe

+0

Хорошо, думаю, я понимаю. Я предположил, что когда вы сказали «обновить данные», вы имели в виду обновление его в представлениях, поскольку вы не упоминали внешний хранилище данных. Да, вы обновляете базовую базу данных в своем коде модели. В моем примере это строка, которая изменяет элемент в self.my_list. Вместо этого вы должны записать обновление в базовую базу данных. –