La maggior parte / soluzione elegante sicura / facile da memorizzare e modificare (GUI) una struttura di directory simile?

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

Domanda

Ho un problema un po 'difficile da risolvere; immaginare questo:

Una delle mie applicazioni ha bisogno di fare un uso pesante di scripting, quindi la mia idea era quella di fornire all'utente un modo per scrivere frammenti di script e organizzarli in una struttura ad albero di directory simile. Questo è molto simile a una directory di codice sorgente con sottodirectory e file di origine.

Classi di dati / Memorizzazione

Il primo problema che ho incontrato è che ho bisogno di trovare un buon modo per memorizzare l'intera struttura ad albero (sul disco, e all'interno dell'applicazione in fase di esecuzione). Per questo ho avuto queste idee:

  1. Utilizzare una classe derivata QObject che può rappresentare l'albero utilizzando le funzionalità padre / figlio di QObject. In questo modo non ho più preoccuparti di eliminare quegli oggetti se essi i genitori vengono eliminati.
  2. Utilizzare una semplice classe che può contenere un QList (senza puntatori) dei bambini e alcune proprietà che memorizzano le proprietà di ogni gruppo / script.
  3. Usa approccio # 2, ma utilizzare puntatori invece di oggetti statici - questo permetterebbe di evitare la copia inutile whenver devo passare un gruppo o di una parte di un albero per una funzione, ecc
  4. .
  5. Utilizzare un backend dal vivo per uno SQLite (o simile) di database, ed eseguire una query in fase di esecuzione. Ciò eviterebbe di caricare l'intero albero in una sola volta e mantenere in RAM.
  6. Utilizzare una lima piatta e la struttura di directory sul file system; anche se credo che questo introduce più problemi di quanto necessario in quanto non v'è alcun modo per memorizzare meta informazioni sugli oggetti.

Editor

Il prossimo problema che ho incontrato è il fatto che l'utente probabilmente vuole modificare l'intera struttura ad albero. Vuole fare clic su un gruppo o uno script, modificare il codice di script e, eventualmente, il drag & drop le directory e script in giro all'interno della struttura; cambiando così la struttura dell'intero albero sulla strada.

Questo pone i seguenti problemi:

  1. Se l'utente chiude l'editor, potrebbe essere una buona idea per fornire lui un "Vuoi salvare le modifiche?" dialogo. Molto simile a un editor di testo in cui si accidentalmente digitato qualcosa in un documento già esistente, ma si esce senza salvare le modifiche. -. Questo richiederebbe che modificare una copia del tutto l'albero, e sovrascrivere l'albero esistente all'interno dell'applicazione quando necessario
  2. Consentire Drag & Drop potrebbe essere problematico ...
    • ... con il la memorizzazione approccio # 1 : attualmente non esiste buon modo per modificare l'ordine dei bambini di QObject. Anche oggetti in movimento intorno a tempo di esecuzione, mentre altre parti del programma li possa accedere non è una buona idea.
    • ... questo è più facile con la memorizzazione approccio # 2 , dal momento che tutto l'albero viene gestito come un singolo valore e non ci sono figli che avrei dovuto muoversi e ri-genitore. Copia di una parte dell'albero copia automaticamente tutti i bambini e così via. Purtroppo questo significherebbe un sacco di spese generali e la perdita in termini di flessibilità (avrei dovuto scrivere tutto l'albero sul disco ancora una volta visto che non posso essere sicuro che cosa esattamente è cambiato).

Io probabilmente aggiornare questa domanda un po 'quando più cose mi vengono in mente, ma sono davvero curioso come le altre persone a risolvere questo problema. Eventuali suggerimenti e le idee sono apprezzati. :)

È stato utile?

Soluzione 2

Per ora risolto il problema limitando la profondità dell'albero utilizzando le classi dedicate. Ciò significa che c'è solo una quantità limitata di profondità dell'albero che deve essere gestita, quindi per ora ho semplicemente uso QTreeTreeWidget e alcuni metodi di supporto che consentono per l'ordinamento, drag & drop e altre caratteristiche interessanti.

Altri suggerimenti

Io suggerirei di dare un'occhiata a QFileSystemModel per le buone pratiche. Il modello deve aggiornare se stesso utilizzando un thread separato per UI reattività, mantenendo una cache e così via. Un modello ben educati dovrebbe anche rendere il vostro lavoro sul l'editor più semplice.

Mi piacerebbe anche andrei per derivare QObject per la creazione di classi TreeItem. Un aproach dati condivisi con QSharedData per una classe di base sarebbe bello. Mi piacerebbe anche avere una proprietà per il suo ordine. In questo modo quando l'utente trascina e lascia cadere o modificare l'ordine in qualsiasi altro modo si dispone di un modo per mantenere il controllo. Dal momento che i dati sono condivisi, mantenendo il proprio elenco di oggetti nel vostro ordine per le prestazioni sarebbe poco costo.

Inoltre, dare un'occhiata a ModelTest .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top