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:
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 itensQTableView
– exibe uma tabela de itens.QTreeView
– exibe dados hierárquicos.
Além desses widgets, o QComboBox
widget também suporta o padrão Model/View.
Além disso, PyQt possui várias classes de modelo base, como QAbstractListModel
,, QAbstractTableModel
e 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.