Solução mais elegante/segura/fácil de armazenar e editar (GUI) uma estrutura de árvore semelhante ao diretório?

StackOverflow https://stackoverflow.com/questions/1882666

Pergunta

Eu tenho um problema um pouco complicado para resolver; Imagina isto:

Um dos meus aplicativos precisa fazer uso pesado de scripts, então minha idéia era fornecer ao usuário uma maneira de escrever trechos de scripts e organizá-los em uma estrutura de árvore semelhante ao diretório. Isso é muito parecido com os diretórios de código -fonte com subdiretos e arquivos de origem.

Classes de dados/armazenamento

O primeiro problema que encontro é que preciso encontrar uma boa maneira de armazenar toda a estrutura da árvore (no disco e dentro do aplicativo em tempo de execução). Para isso, eu tinha essas idéias:

  1. Use uma classe derivada de QObject que pode representar a árvore usando os recursos de pai/filho do QOBject. Dessa forma, não preciso me preocupar em excluir esses objetos se os pais forem excluídos.
  2. Use uma classe simples que possa conter uma lista Q (sem ponteiros) de crianças e algumas propriedades que armazenam as propriedades de cada grupo/script.
  3. Use a abordagem nº 2, mas use ponteiros em vez de objetos estáticos - isso evitaria cópia inútil quando tiver que passar por um grupo ou parte de uma árvore para uma função, etc.
  4. Use um back -end ao vivo para um banco de dados SQLITE (ou similar) e consulte -o em tempo de execução. Isso evitaria carregar a árvore inteira de uma só vez e mantê -la em RAM.
  5. Use um arquivo plano e uma estrutura de diretório no sistema de arquivos; Embora eu ache que isso apresenta mais problemas do que o necessário, porque não há como armazenar meta informações sobre objetos.

editor

O próximo problema que encontro é o fato de que o usuário provavelmente deseja editar toda a estrutura da árvore. Ele deseja clicar em um grupo ou script, editar o código do script e possivelmente arrastar e soltar diretórios e scripts dentro da árvore; Mudando assim a estrutura de toda a árvore a caminho.

Isso levanta os seguintes problemas:

  1. Se o usuário fechar o editor, pode ser uma boa ideia fornecer a ele um "Você deseja salvar as alterações?" diálogo. Muito parecido com um editor de texto onde você digitou algo acidentalmente em um documento existente, mas sai sem salvar as alterações. - Isso exigiria que editássemos uma cópia de toda a árvore e substituíssem a árvore existente no aplicativo quando necessário.
  2. Permitir arrastar e soltar pode ser problemático ...
    • ... com o Abordagem de armazenamento #1: Atualmente, não existe uma boa maneira de mudar a ordem dos filhos de Qobjects. Também mover objetos em tempo de execução, enquanto outras partes do programa podem acessá -los não é uma boa ideia.
    • ... isso é mais fácil com Abordagem de armazenamento #2, como toda a árvore é tratada como um único valor e não há filhos que eu teria que me mover e re-parente. Copiar uma parte da árvore copia automaticamente todas as crianças e assim por diante. Infelizmente, isso significaria muita sobrecarga e perda de flexibilidade (eu teria que escrever toda a árvore no disco novamente, pois não posso ter certeza do que exatamente mudou).

Provavelmente, atualizarei uma pergunta um pouco quando mais coisas me vendem, mas estou realmente curioso para saber como as outras pessoas resolvem esse problema. Quaisquer sugestões e idéias são apreciadas. :)

Foi útil?

Solução 2

Até agora eu resolvi o problema limitando a profundidade da árvore usando classes dedicadas. Isso significa que há apenas uma quantidade limitada de profundidade de árvore que precisa ser tratada; portanto, por enquanto, eu simplesmente uso o QTreetreewidget e alguns métodos auxiliares que permitem classificar, arrastar e soltar e outros recursos agradáveis.

Outras dicas

Eu sugiro que você dê uma olhada no QFilesystemModel para obter boas práticas. O modelo deve se atualizar usando um encadeamento separado para a capacidade de resposta da interface do usuário, mantendo um cache e assim por diante. Um modelo bem comportado também deve facilitar seu trabalho no editor.

Eu também iria para derivar QObject para criar suas aulas Treeitem. Uma abordagem de dados compartilhada com QSharedData para uma classe base seria agradável. Eu também teria uma propriedade para sua ordem. Dessa forma, quando o usuário arrasta e cai ou altera o pedido de qualquer outra maneira que você tenha uma maneira de manter o controle. Como os dados são compartilhados, manter sua própria lista de objetos em seu pedido de desempenho teria pouco custo.

Além disso, dê uma olhada em ModelTest.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top