Modelo/Visualização PyQt

Resumo : neste tutorial, você aprenderá como funciona o padrão PyQt Model/View e suas vantagens.

Introdução ao modelo PyQt/padrão de visualização

Model-View-Controller ou MVC é um padrão de software para desenvolvimento de interfaces de usuário (UI). O padrão MVC separa UI (visualizações), dados (modelos) e lógica de aplicativo (controladores):

  • Os modelos representam os dados da aplicação ou contêm a lógica para obter os dados de um banco de dados.
  • As visualizações são responsáveis ​​por apresentar modelos através da interface do usuário.
  • Os controladores lidam com as entradas do usuário, trabalham com os modelos e selecionam visualizações para exibir os dados.

O objetivo do MVC é conseguir a separação de interesses entre modelos, visualizações e controladores.

O MVC facilita adicionar ou modificar visualizações sem alterar os modelos subjacentes. Além disso, o MVC permite escrever testes de unidade direcionados ao modelo e ao controlador sem envolver a UI.

Outra vantagem do MVC é que um modelo pode ter múltiplas visualizações. E todas essas visualizações podem ser atualizadas automaticamente com base no mesmo modelo.

PyQt usa uma variante do padrão MVC combinando a visualização e o controlador do MVC na visualização, o que resulta na arquitetura Model/View.

A arquitetura Model/View permite que o PyQt mantenha a interdependência dos componentes ao mínimo e melhore a reutilização.

A imagem a seguir ilustra o padrão PyQt Model/View:

Visualização do modelo PyQt

Na arquitetura Model/View, a visualização lida com a renderização de dados por meio de um delegado. Um delegado tem duas responsabilidades principais:

  • Renderiza dados.
  • Comunica-se com o modelo quando os dados são editados.

Os modelos, visualizações e delegados comunicam-se entre si por meio de sinais e slots.

PyQt fornece alguns widgets padrão de modelo/visualização:

  • QListView– exibe uma lista de itens
  • QTableView– exibe uma tabela de itens.
  • QTreeView– exibe dados hierárquicos.

Além desses widgets, o QComboBoxwidget também suporta o padrão Model/View.

Além disso, PyQt possui várias classes de modelo base, como QAbstractListModel,, QAbstractTableModele QStandardItemModel.

Exemplo de modelo/visualização PyQt

Tomaremos um exemplo simples para ilustrar o modelo/visualização PyQt:

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QComboBox, QListView
from PyQt6.QtCore import Qt, QStringListModel


class MainWindow(QWidget):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setGeometry(100, 100, 400, 200)
        self.setWindowTitle('PyQt Model/View')

        layout = QVBoxLayout()
        self.setLayout(layout)
        
        model = QStringListModel()
        model.setStringList(['Apple','Banana','Orange'])
        
        self.list_view = QListView()
        self.list_view.setModel(model)
        
        self.combo_box = QComboBox()
        self.combo_box.setModel(model)
        
        layout.addWidget(self.combo_box) 
        layout.addWidget(self.list_view)
                       
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())
Linguagem de código:  Python  ( python )

Como funciona.

Neste exemplo, temos dois widgets, uma caixa de combinação e uma visualização de lista. Ambos os widgets usam o mesmo modelo que é uma instância do QStringListModel:

Se você alterar um item de um widget, o outro widget atualizará as alterações automaticamente. Em outras palavras, você não precisa escrever nenhum código para manter sincronizados todos os widgets que usam o mesmo modelo:

Primeiro, crie uma nova instância da classe QStringListModel e defina uma lista de strings:

model = QStringListModel()
model.setStringList(['Apple','Banana','Orange'])Linguagem de código:  JavaScript  ( javascript )

Segundo, crie um widget QListView e configure seu modelo para o modelo:

self.list_view = QListView()
self.list_view.setModel(model)Linguagem de código:  PHP  ( php )

Terceiro, crie um widget QComboBox e defina seus modelos para o mesmo modelo do widget QListView:

self.combo_box = QComboBox()
self.combo_box.setModel(model)Linguagem de código:  PHP  ( php )

Resumo

  • PyQt usa o padrão de modelo/visualização para conseguir a separação de interesses.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *