A partir da versão 4, o Qt passou a disponibilizar um conjunto de classes (vistas/views) que, baseando-se na Arquitectura Modelo/Vista (Model/View Architecture), possibilitam a fácil manipulação dos dados, bem como a forma como estes são apresentados ao utilizador.

A base teórica em que assenta esta arquitectura é a MVC ( model–view–controller ), popularizada pela linguagem Smalltalk.
No caso do Qt, o papel desempenhado pelo controller é substituído por uma forma diferente de abstracção, o delegate.
Não pretendo com este texto reinventar a roda, mas apenas dar a conhecer esta importante funcionalidade do Qt, com infinitas aplicações, e capaz de poupar muitas linhas de código comparativamente com abordagens mais tradicionais.
Está tudo explicado aqui e noutras páginas relacionadas: http://qt.nokia.com/doc/4.6/model-view-introduction.html
Por fim partilho um pequeno exemplo que escrevi, que podem espreitar aqui.
Este consiste basicamente em dois dialogs com os quais é possível gerir a informação armazenada em duas tabelas relacionadas, cujo modelo é representado na figura seguinte:
Os interfaces com o utilizador, associados a cada um dos modelos, são os seguintes:
Notas importantes que ajudam a compreender melhor este exemplo:
- a tabela “Cidadao” contém informação sobre pessoas, destacando-se o campo “localidade”, utilizado como “chave estrangeira” e, como tal, a fazer a ligação com a tabela “Localidade”, por intermédio do seu campo chave “idLocalidade”;
- no código apresentado “vistaCidadao” e “modeloCidadao” representam respectivamente os objectos utilizados, no âmbito da arquitectura modelo/vista, a vista utilizada para interagir com o utilizador e o modelo subjacente.
- de forma semelhante os mesmos princípios são utilizados para a tabela “Localidade”, sendo os nomes dos objectos utilizados neste caso “vistaLocalidade” e “modeloLocalidade”;
- a grande diferença entre os objectos “modeloLocalidade” e “modeloCidadao”, resulta do facto de terem sido instanciados respectivamente a partir das classes QSqlTableModel e QSqlRelationalTableModel;
- o motor utilizado no exemplo é o InnoDB(http://dev.mysql.com/doc/refman/5.0/en/innodb.html), com todas as especificidades que lhe estão associadas, particularmente no que diz respeito à utilização de “constraints” associadas à “foreign key” (http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html);
- quando a aplicação é executada é sempre inserido um registo na tabela “Localidade”, correspondente a uma localidade de código 9999, que representa uma “localidade desconhecida”, uma vez que, tal como se pode observar no Diagrama E-R, a relação é de participação obrigatória;
- para a criação da base de dados disponibilizo duas possibilidades, sendo a primeira o script “script.sql”, e a segunda o ficheiro “mva1.mwb”, que pode ser aberto com o MySQL Workbench e utilizado para criar a base de dados;
- a relação existente entre as duas tabelas é do tipo “non-identifying”;
- a aplicação faz o teste para verificar se a chave é duplicada pelo simples facto de poder enviar uma mensagem ao utilizador e processar essa situação de forma específica;
- no main.cpp, “createConnection(“localhost”, “mva1″, “qtuser”, “123″)” significa que o servidor mysql está a correr em localhost, a base de dados chama-se mva1, o utilizador é o qtuser e a respectiva palavra-passe é 123;
- não me ocorre mais nada … continua nos comentários ao artigo ;)
Bom proveito … porque este exemplo deu-me uma trabalheira :))))













