Friday 8 September 2017

Forex varsity qtableview esconder


Tiny Lanterna. . Tiny Flashlight - Android Market,: - -,. - - - -. ,. ,. ,. . - benzóico. . Tiny Lanterna -,. ,. . . ,. . ,. . . . , 3.7 (), play market,),) Cada desenvolvedor de UI deve saber sobre a programação do ModelView e o objetivo deste tutorial é fornecer uma introdução facilmente fácil a esse tópico. Os widgets de tabela, lista e árvore são componentes freqüentemente usados ​​em GUIs. Existem 2 maneiras diferentes de como esses widgets podem acessar seus dados. A forma tradicional envolve widgets que incluem recipientes internos para armazenar dados. Essa abordagem é muito intuitiva, no entanto, em muitas aplicações não triviais, ela leva a problemas de sincronização de dados. A segunda abordagem é a programação do modeloview, em que os widgets não mantêm contêineres de dados internos. Eles acessam dados externos através de uma interface padronizada e, portanto, evitam a duplicação de dados. Isto pode parecer complicado no início, mas quando você olha mais de perto, não é apenas fácil de entender, mas os muitos benefícios da programação de modelview também se tornam mais claros. Qt: a diferença entre widgets padrão e modelview Adaptadores entre formulários e modelos Desenvolvendo um aplicativo modelview simples Modelos pré-definidos Tópicos intermediários, tais como: Exibição de árvores Seleção Depuração com teste de modelo Você também saberá se sua nova aplicação pode ser escrita mais facilmente com a programação modeloview Ou se os widgets clássicos funcionarão igualmente bem. Este tutorial inclui código de exemplo para você editar e integrar em seu projeto. O código-fonte dos tutoriais está localizado no diretório Qts examplestutorialsmodelview. Para obter informações mais detalhadas, você também pode querer consultar a documentação de referência Qt, Qt. . 1. ModelView é uma tecnologia usada para separar dados de visualizações em widgets que manipulam conjuntos de dados. Os widgets padrão não foram projetados para separar dados de visualizações e é por isso que o Qt 4 possui dois tipos diferentes de widgets. Ambos os tipos de widgets são os mesmos, mas interagem com os dados de forma diferente. Os widgets padrão usam dados que fazem parte do widget. Ver classes operam em dados externos (o modelo) 1.1 Widgets padrão Permite ter um olhar mais atento sobre um widget de tabela padrão. Um widget de tabela é uma matriz 2D dos elementos de dados que o usuário pode alterar. O widget de tabela pode ser integrado em um fluxo de programa lendo e escrevendo os elementos de dados que o widget de tabela fornece. Este método é muito intuitivo e útil em muitas aplicações, mas exibir e editar uma tabela de banco de dados com um widget de tabela padrão pode ser problemático. Duas cópias dos dados têm de ser coordenadas: uma fora do widget um dentro do widget. O desenvolvedor é responsável por sincronizar ambas as versões. Além disso, o acoplamento apertado de apresentação e dados torna mais difícil escrever testes de unidade. 1.2 ModelView para o Rescue Modelview intensificou-se para fornecer uma solução que usa uma arquitetura mais versátil. O Modelview elimina os problemas de consistência de dados que podem ocorrer com widgets padrão. O Modelview também facilita o uso de mais de uma visão dos mesmos dados porque um modelo pode ser transmitido para muitas visualizações. A diferença mais importante é que os widgets modelview não armazenam dados atrás das células da tabela. Na verdade, eles operam diretamente de seus dados. Como as classes de exibição não conhecem a estrutura de dados, é necessário fornecer um wrapper para tornar seus dados compatíveis com a interface QAbstractItemModel. Uma visualização usa essa interface para ler e gravar os dados. Qualquer instância de uma classe que implemente QAbstractItemModel é dito ser um modelo. Uma vez que a vista recebe um ponteiro para um modelo, ele lerá e exibirá seu conteúdo e será seu editor. 1.3 Visão geral dos widgets ModelView Aqui está uma visão geral dos widgets do modelo e seus correspondentes widgets padrão. (Uma classe de conveniência baseada em item) O QComboBox pode funcionar como uma classe de vista e também como um widget tradicional 1.4 Usando adaptadores entre formulários e modelos Ter adaptadores entre formulários e modelos pode ser útil. Podemos editar dados armazenados em tabelas diretamente a partir da própria tabela, mas é muito mais confortável editar dados em campos de texto. Não existe uma contrapartida de modelo modelo direta que separe dados e visualizações para widgets que operam em um valor (QLineEdit. QCheckBox.) Em vez de um conjunto de dados, por isso precisamos de um adaptador para conectar o formulário à fonte de dados. QDataWidgetMapper é uma ótima solução porque mapeia widgets de formulário em uma linha de tabela e facilita a criação de formulários para tabelas de banco de dados. Outro exemplo de um adaptador é QCompleter. Qt tem QCompleter para fornecer auto-completions em widgets Qt como QComboBox e, como mostrado abaixo, QLineEdit. QCompleter usa um modelo como sua fonte de dados. 2. Se você quiser desenvolver um aplicativo de modelview, onde deve começar, recomendamos começar com um exemplo simples e estendê-lo passo a passo. Isso facilita a compreensão da arquitetura. Tentando entender a arquitetura do modelo em detalhes antes de invocar o IDE provou ser menos conveniente para muitos desenvolvedores. É substancialmente mais fácil começar com um aplicativo modelview simples que tenha dados de demonstração. Experimente Simplesmente substitua os dados nos exemplos abaixo com os seus. Abaixo estão 7 aplicativos muito simples e independentes que mostram diferentes lados da programação do modeloview. O código-fonte pode ser encontrado dentro do diretório examplest tutorialsmodelview. 2.1 Uma tabela Somente Leitura Começamos com um aplicativo que usa um QTableView para mostrar dados. Vamos adicionar capacidades de edição mais tarde. (Fonte do arquivo: examplestutorialsmodelview1readonlymain. cpp) Temos a função principal usual (): Aqui é a parte interessante: criamos uma instância do MyModel e usamos tableView. setModel (ampmyModel) para passar um ponteiro do mesmo para tableView. TableView invoca os métodos do ponteiro que recebeu para descobrir duas coisas: quantas linhas e colunas devem ser exibidas. O conteúdo deve ser impresso em cada célula. O modelo precisa de algum código para responder a isso. Temos um conjunto de dados de tabela, então vamos começar com QAbstractTableModel, pois é mais fácil de usar do que o QAbstractItemModel mais geral. (: Examplestutoringsmodelview1readonlymymodel. h) QAbstractTableModel. (: Examplestutorialsmodelview1readonlymymodel. cpp) O número de linhas e colunas é fornecido por MyModel :: rowCount () e MyModel :: columnCount (). Quando a visão tem que saber qual é o texto das células, ele chama o método MyModel :: data (). As informações de linha e coluna são especificadas com o índice de parâmetros e a função é definida como Qt :: DisplayRole. Outras funções são abordadas na próxima seção. Em nosso exemplo, os dados que devem ser exibidos são gerados. Em um aplicativo real, MyModel teria um membro chamado MyData. Que serve como alvo para todas as operações de leitura e escrita. Este pequeno exemplo demonstra a natureza passiva de um modelo. O modelo não sabe quando será usado ou quais os dados necessários. Simplesmente fornece dados cada vez que a visualização o solicita. O que acontece quando os dados dos modelos precisam ser alterados Como a visão percebe que os dados mudaram e precisam ser lidos novamente O modelo tem que emitir um sinal que indica qual intervalo de células foi alterado. Isso será demonstrado na seção 2.3. 2.2 Estendendo o exemplo somente leitura com funções Além de controlar o texto que a tela exibe, o modelo também controla a aparência dos textos. Quando alteramos ligeiramente o modelo, obtemos o seguinte resultado: De fato, nada, exceto o método data (), precisa ser alterado para definir fontes, cor de plano de fundo, alinhamento e uma caixa de seleção. Abaixo está o método data () que produz o resultado mostrado acima. A diferença é que desta vez usamos o parâmetro int role para retornar diferentes informações dependendo do seu valor. (: Examplestutorialsmodelview2formattingmymodel. cpp) Cada propriedade de formatação será solicitada do modelo com uma chamada separada para o método data (). O parâmetro de função é usado para permitir que o modelo conheça qual propriedade está sendo solicitada: Consulte a documentação do espaço de nome do Qt para saber mais sobre os recursos de enumeração Qt :: ItemDataRole enums. Agora, precisamos determinar como o uso de um modelo separado afeta o desempenho das aplicações, de modo que podemos rastrear com que frequência a exibição chama o método data (). Para acompanhar com que frequência a exibição chama o modelo, colocamos uma declaração de depuração no método data (), que faz logon no fluxo de saída de erro. Em nosso pequeno exemplo, data () será chamado 42 vezes. Cada vez que você passar o cursor sobre o campo, data () será chamado novamente 7 vezes para cada célula. É por isso que é importante certificar-se de que seus dados estão disponíveis quando dados () são invocados e as operações de pesquisa caras são armazenadas em cache. 2.3 Um relógio dentro de uma célula de tabela Ainda temos uma tabela de somente leitura, mas desta vez o conteúdo muda a cada segundo porque mostramos a hora atual. (: Examplestutorialsmodelview3changingmodelmymodel. cpp) Falta algo para fazer o relógio marcar. Precisamos contar à vista a cada segundo que o tempo mudou e que precisa ser lido novamente. Fazemos isso com um temporizador. No construtor, configuramos seu intervalo para 1 segundo e conecta seu sinal de tempo limite. (: Examplestutorialsmodelview3changingmodelmymodel. cpp) Aqui está o slot correspondente: (: examplestutorialsmodelview3changingmodelmymodel. cpp) Pedimos a visualização para ler os dados na célula superior esquerda novamente emitindo o sinal dataChanged (). Observe que não conectamos explicitamente o sinal dataChanged () à vista. Isso aconteceu automaticamente quando chamamos setModel (). 2.4 Configuração de Cabeçalhos para Colunas e Linhas Os cabeçalhos podem ser ocultados através de um método view: tableView-gtverticalHeader () - gthide () O conteúdo do cabeçalho, no entanto, é definido através do modelo, então reimplementamos o método headerData (): (: examplestutorialsmodelview4headersmymodel. cpp) Observe que o método headerData () também possui uma função de parâmetro que tem o mesmo significado que em MyModel :: data (). 2.5 O exemplo de edição mínima Neste exemplo, vamos construir um aplicativo que preencha automaticamente um título de janela com conteúdo, repetindo valores inseridos nas células da tabela. Para poder acessar facilmente o título da janela, colocamos o QTableView em QMainWindow. O modelo decide se os recursos de edição estão disponíveis. Nós só temos que modificar o modelo para que os recursos de edição disponíveis sejam habilitados. Isso é feito reimplementando os seguintes métodos virtuais: setData () e flags (). (: Examplestutorialsmodelview5editmymodel. h) Usamos a matriz bidimensional QString mgridData para armazenar nossos dados. Isso faz com que mgridData seja o núcleo do MyModel. O resto do MyModel funciona como um invólucro e adapta mgridData à interface QAbstractItemModel. Também introduzimos o sinal editCompleted (), que permite transferir o texto modificado para o título da janela. (: Examplestutoringsmodelview5editmymodel. cpp) setData () será chamado cada vez que o usuário edita uma célula. O parâmetro de índice nos diz qual campo foi editado e o valor fornece o resultado do processo de edição. O papel sempre será definido como Qt :: EditRole porque nossas células apenas contêm texto. Se uma caixa de seleção estava presente e as permissões de usuário estiverem definidas para permitir que a caixa de seleção seja selecionada, as chamadas também seriam feitas com a função definida para Qt :: CheckStateRole. (: Examplestutorialsmodelview5editmymodel. cpp) Várias propriedades de uma célula podem ser ajustadas com flags (). Se a edição de uma célula modificar mais dados do que os dados nessa célula em particular, o modelo deve emitir um sinal dataChanged () para que os dados que foram alterados sejam lidos. 3. Tópicos intermediários 3.1 TreeView Você pode converter o exemplo acima em um aplicativo com uma exibição em árvore. Basta substituir o QTableView pelo QTreeView. Que resulta em uma árvore readwrite. Não é necessário fazer modificações no modelo. A árvore não terá hierarquias porque não há hierarquias no próprio modelo. QListView. QTableView e QTreeView todos usam uma abstração de modelo, que é uma lista mesclada, tabela e árvore. Isso torna possível usar vários tipos diferentes de classes de visualização do mesmo modelo. É assim que nosso modelo de exemplo parece até agora: queremos apresentar uma árvore real. Nós embalamos nossos dados nos exemplos acima para fazer um modelo. Desta vez, usamos QStandardItemModel. Que é um contêiner para dados hierárquicos que também implementa QAbstractItemModel. Para mostrar uma árvore, QStandardItemModel deve ser preenchido com QStandardItem s, que são capazes de manter todas as propriedades padrão de itens como texto, fontes, caixas de seleção ou pincéis. (: Examplestutorialsmodelview6treeviewmainwindow. cpp) Nós simplesmente instanciar um QStandardItemModel e adicionar um par de QStandardItems para o construtor. Podemos então criar uma estrutura de dados hierárquica porque um QStandardItem pode conter outros QStandardItems. Os nós são recolhidos e expandidos na vista. 3.2 Trabalhando com Seleções Queremos acessar um conteúdo de itens selecionados para emiti-lo no título da janela juntamente com o nível hierárquico. Então vamos criar um par de itens: (: examplestutorialsmodelview7selections mainwindow. cpp) As visualizações gerenciam seleções dentro de um modelo de seleção separado, que pode ser recuperado com o método selectionModel (). Nós recuperamos o modelo de seleção para conectar um slot ao seu sinal selectionChanged (). (: Examplestutorialsmodelview7selections mainwindow. cpp) Obtemos o índice de modelo que corresponde à seleção chamando treeView-gtselectionModel () - gtcurrentIndex () e obtemos a string de campos usando o índice de modelo. Então nós apenas calculamos os itens hierarchyLevel. Os itens de nível superior não têm pais eo método pai () retornará um QModelIndex construído padrão (). É por isso que usamos o método parent () para iterar para o nível superior enquanto contamos os passos realizados durante a iteração. O modelo de seleção (como mostrado acima) pode ser recuperado, mas também pode ser configurado com QAbstractItemView :: setSelectionModel. É assim que é possível ter 3 classes de visualização com seleções sincronizadas porque apenas uma instância de um modelo de seleção é usada. Para compartilhar um modelo de seleção entre 3 exibições, use selectionModel () e atribua o resultado à segunda e terceira classe de exibição com setSelectionModel (). 3.3 Modelos pré-definidos A maneira típica de usar a modelview é envolver dados específicos para torná-lo utilizável com as classes de visualização. No entanto, o Qt também fornece modelos predefinidos para estruturas de dados subjacentes comuns. Se uma das estruturas de dados disponíveis é adequada para sua aplicação, um modelo predefinido pode ser uma boa escolha. Armazena uma lista de strings Classifica e / ou filtra outro modelo 3.4 Em todos os exemplos até agora, os dados são apresentados como texto ou como caixa de seleção em uma célula e são editados como texto ou como caixa de seleção. O componente que fornece esses serviços de apresentação e edição é chamado de delegado. Estamos apenas começando a trabalhar com o delegado porque a vista usa um delegado padrão. Mas imagine que queremos ter um editor diferente (por exemplo, um controle deslizante ou uma lista suspensa) Ou imagine que queremos apresentar dados como gráficos. Vejamos um exemplo chamado Star Delegate. Em que as estrelas são usadas para mostrar uma classificação: A visualização tem um método setItemDelegate () que substitui o delegado padrão e instala um delegado personalizado. Um novo delegado pode ser escrito criando uma classe que herda de QStyledItemDelegate. Para escrever um delegado que exibe estrelas e não tem recursos de entrada, só precisamos substituir 2 métodos. Paint () desenha estrelas dependendo do conteúdo dos dados subjacentes. Os dados podem ser consultados chamando index. data (). O método sizeHint () dos delegados é usado para obter cada dimensão de estrelas, de modo que a célula irá fornecer altura e largura suficientes para acomodar as estrelas. Escrever delegados personalizados é a escolha certa se você quiser mostrar seus dados com uma representação gráfica personalizada dentro da grade da classe view. Se você quiser deixar a grade, você não usaria um delegado personalizado, mas uma classe de exibição personalizada. Outras referências aos delegados na Qt Documentation: 3.5 Depuração com o ModelTest A natureza passiva dos modelos fornece novos desafios para os programadores. Inconsistências no modelo podem causar a falha do aplicativo. Uma vez que o modelo é atingido por várias chamadas a partir da vista, é difícil descobrir qual chamada caiu a aplicação e qual operação introduziu o problema. O Qt Labs fornece software chamado ModelTest. Que verifica os modelos enquanto sua programação está sendo executada. Toda vez que o modelo for alterado, o ModelTest verifica o modelo e relata erros com um assert. Isso é especialmente importante para os modelos de árvores, uma vez que sua natureza hierárquica deixa muitas possibilidades para inconsistências sutis. Ao contrário das classes de visualização, o ModelTest usa índices fora do intervalo para testar o modelo. Isso significa que seu aplicativo pode falhar com ModelTest mesmo se ele executa perfeitamente sem ele. Então você também precisa lidar com todos os índices que estão fora do alcance ao usar ModelTest. 4. A programação do ModelView é bastante abordada na documentação do Qt, mas também em vários bons livros. C GUI Programação com Qt 4 Jasmin Blanchette, Mark Summerfield, Prentice Hall, 2 ª edição. ISBN 0-13-235416-0. Também disponível em alemão: C GUI Programmierung mit Qt 4: Die offizielle Einfhrung. Addison-Wesley. ISBN 3-827327-29-6 O Livro de Qt4, A Arte de Construir Aplicações Qt Daniel Molkentin, Open Source Press. ISBN 1-59327-147-6. Traduzido de Qt 4, Einfhrung in die Applikationsentwicklung. Open Source Pressione. ISBN 3-937514-12-0. Fundações do Qt Development Johan Thelin, Apress. ISBN 1-59059-831-8. Programação Avançada Qt Mark Summerfield, Prentice Hall. ISBN 0-321-63590-6. Este livro abrange programação ModelView em mais de 150 páginas. Mais informações sobre esses livros estão disponíveis no site da Qt. A lista a seguir fornece uma visão geral dos programas de exemplo contidos nos três primeiros livros listados acima. Alguns deles fazem modelos muito bons para desenvolver aplicações semelhantes. Exemplo de delegado personalizado abrangente. Demonstrações são semelhantes aos exemplos, exceto que não é fornecido nenhum passo a passo para o código. Demonstrações são tipicamente mais rico em recursos do que exemplos. A demonstração Entrevista mostra o mesmo modelo e seleção sendo compartilhada entre três modos de exibição diferentes. A demonstração do Spreadsheet ilustra o uso de uma exibição de tabela como uma planilha, usando delegados personalizados para processar cada item de acordo com o tipo de dados que ele contém. Um documento de referência para a tecnologia modelview também está disponível. 2008-2011 Nokia Corporation. Nokia, Qt Nokia Corporation. . , Qt, Qt,,,,, Nokia. , GNU Free Documentation License versão 1.3. Fundação para o Software Livre. Qt. ,,: Qt. :

No comments:

Post a Comment