Domanda

la mia domanda è su Qt e la sua QAbstractItemModel .

Ho una mappa di stringhe e doppie (std::map<stringclass, double>) che vorrei presente in un widget Qt. Mentre ho potuto utilizzare QTableView per questo, vorrei sfruttare il fatto che le chiavi della mappa sono di forma "abc.def.ghi" dove non ci può essere più stringhe che possono iniziare con "abc.def" e ancora di più che iniziano con "abc".

Quindi vorrei per impostare un modello di dati albero di presentare gli elementi di una QTreeView come

(-) abc
    |--(-)def      
          |--ghi    3.1415
          |--jkl    42.0815
    |--(+)pqr
    |--(+)xyz

Le chiavi della mia std::map sono le foglie dell'albero, in cui tutti gli altri nodi sarebbero costrutti temporanei e al personale ausiliario per sostenere la piegatura per comodità dell'utente.

Purtroppo, i metodi di rowCount, index, columnCount, e data Hanno const modificatori, quindi non posso semplicemente messa a punto una struttura di dati ausiliario per le intestazioni all'interno del mio QAbstractItemModel derivato e di cambiamento che la struttura di dati in là.

Quale sarebbe la migliore pratica per questo? installazione dovrebbe Ho un altro strato di classe tra la mia std::map e il QAbstractItemModel o c'è un modo più intelligente per fare questo?


Modifica 1: Il std::map può cambiare mentre il QTreeView viene mostrato e utilizzati, in modo che i nodi auxillary potrebbero essere gettati via e ricostruite. La mia ipotesi è che il modo migliore per gestire questa situazione è quello di ristrutturare la QAbstractItemModel - o dovrei semplicemente buttare via quel modello e assegnare uno di nuova constructred alla QTreeView ? In quel caso potrei set-up tutti i nodi all'interno del costruttore senza essere disturbati dal const-ness dei metodi, immagino.

È stato utile?

Soluzione

vorrei analizzare la mappa e creare una struttura dati ad albero basato su di esso. Assicurati di sincronizzare il modello quando si cambia la mappa. Se questo passaggio di sincronizzazione diventa troppo complicato si potrebbe desiderare di tenere i dati in una struttura ad albero fin dall'inizio e convertito ad una mappa in caso di necessità.

Analisi mappa al volo nelle funzioni del modello sembra una cattiva idea per me, che ci si vuole queste funzioni per essere il più veloce possibile.

Altri suggerimenti

Non vedo come const modificatori sarebbe davvero essere un problema.

Quali membri del derivato QAbstractItemModel vorresti modificare quando rowCount, index, columnCount e metodi data si chiamano? Si può benissimo memorizzare un riferimento alla tua mappa e calcolare tutto da esso. Non c'è bisogno di modificare la mappa stessa per estrarre le informazioni necessarie (per quanto posso dire!).

Modifica dopo EDIT1 e commenti :
Se la mappa è destinato ad essere modificato, utilizzarlo come struttura di base nella propria classe. Se non si può tenere un riferimento alla mappa perché la vita del modello potrebbe essere superiore della mappa, utilizzare puntatori intelligenti per assicurarsi che non accada.

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