Resposta curta
O MVC do Qt só se aplica a uma estrutura de dados . Ao falar sobre um aplicativo MVC , você não deve pensar em QAbstractItemModel
ou QListView
.
Se você deseja uma arquitetura MVC para todo o seu programa, o Qt não possui uma estrutura de modelo / visualização tão "grande". Mas para cada lista / árvore de dados em seu programa, você pode usar a abordagem Qt MVC, que de fato tem um controlador em sua visualização. Os dados estão dentro ou fora do modelo; isso depende de que tipo de modelo você está usando (própria subclasse de modelo: provavelmente dentro do modelo; por exemplo, QSqlTableModel: fora (mas talvez em cache dentro) do modelo). Para colocar seus modelos e visualizações juntos, use as próprias classes que implementam a lógica de negócios .
Resposta longa
Abordagem e terminologia do modelo / visão do Qt:
Qt fornece visualizações simples para seus modelos. Eles têm um controlador embutido: selecionar, editar e mover itens é algo que na maioria dos casos um controlador "controla". Ou seja, interpretar a entrada do usuário (cliques e movimentos do mouse) e fornecer os comandos apropriados ao modelo.
Os modelos do Qt são de fato modelos com dados subjacentes. Os modelos abstratos obviamente não armazenam dados, já que o Qt não sabe como você deseja armazená-los. Mas você estende um QAbstractItemModel às suas necessidades adicionando seus contêineres de dados à subclasse e tornando a interface do modelo acessando seus dados. Então, na verdade, e suponho que você não goste disso, o problema é que você precisa programar o modelo, então como os dados são acessados e modificados em sua estrutura de dados.
Na terminologia MVC, o modelo contém os dados e a lógica . No Qt, depende de você incluir ou não parte de sua lógica de negócios dentro de seu modelo ou colocá-la fora, sendo uma "visão" por si só. Não está nem claro o que se entende por lógica: selecionar, renomear e mover itens? => já implementado. Fazendo cálculos com eles? => Colocar fora ou dentro da subclasse do modelo. Armazenando ou carregando dados de / para um arquivo? => Colocar dentro da subclasse do modelo.
Minha opinião pessoal:
É muito difícil fornecer um sistema MV (C) bom e genérico para um programador. Como na maioria dos casos os modelos são simples (por exemplo, apenas listas de strings), o Qt também fornece um QStringListModel pronto para usar. Mas se seus dados são mais complexos do que strings, você decide como deseja representar os dados por meio da interface de modelo / visualização Qt. Se você tem, por exemplo, uma estrutura com 3 campos (digamos pessoas com nome, idade e sexo), você pode atribuir os 3 campos a 3 colunas diferentes ou a 3 papéis diferentes. Não gosto de ambas as abordagens.
Acho que a estrutura de modelo / visualização do Qt só é útil quando você deseja exibir estruturas de dados simples . Torna-se difícil de manusear se os dados são de tipos personalizados ou não estruturados em uma árvore ou lista (por exemplo, um gráfico). Na maioria dos casos, as listas são suficientes e, mesmo em alguns casos, um modelo deve conter apenas uma única entrada. Especialmente se você deseja modelar uma única entrada com atributos diferentes (uma instância de uma classe), a estrutura de modelo / visualização do Qt não é a maneira certa de separar a lógica da interface do usuário.
Para resumir as coisas, eu acho que o framework de model / view do Qt é útil se e somente se seus dados estão sendo vistos por um dos widgets do viewer do Qt . É totalmente inútil se você estiver prestes a escrever seu próprio visualizador para um modelo contendo apenas uma entrada, por exemplo, as configurações do seu aplicativo, ou se seus dados não forem do tipo imprimível.
Como usei o modelo / visão Qt em um aplicativo (maior)?
Certa vez, escrevi (em equipe) um aplicativo que usa vários modelos Qt para gerenciar dados. Decidimos criar um DataRole
para conter os dados reais, que eram de um tipo personalizado diferente para cada subclasse de modelo diferente. Criamos uma classe de modelo externo chamada Model
contendo todos os diferentes modelos Qt. Também criamos uma classe de visualização externa chamada View
segurando as janelas (widgets) que estão conectadas aos modelos internos Model
. Portanto, esta abordagem é um Qt MVC estendido, adaptado às nossas próprias necessidades. Ambas as classes Model
e View
não têm nada a ver com o Qt MVC.
Onde colocamos a lógica ? Criamos classes que faziam os cálculos reais nos dados lendo os dados dos modelos de origem (quando eram alterados) e gravando os resultados nos modelos de destino. Do ponto de vista do Qt, essas classes lógicas seriam visualizações, uma vez que "se conectam" aos modelos (não "visualização" para o usuário, mas uma "visualização" para a parte lógica de negócios do aplicativo).
Onde estão os controladores ? Na terminologia MVC original, os controladores interpretam a entrada do usuário (mouse e teclado) e dão comandos ao modelo para executar a ação solicitada. Como as visualizações do Qt já interpretam a entrada do usuário como renomear e mover itens, isso não era necessário. Mas o que precisávamos era de uma interpretação da interação do usuário que fosse além das visualizações do Qt.