Domanda

Saluti,

ho scritto qualche codice brutto per sostenere l'undo / redo di cancellazione di un insieme arbitrario di oggetti dal mio modello. Mi sento come sto andando su questo in modo corretto, come tutte le altre mutators (aggiungendo / copia-incolla) sono sottoinsiemi di questa funzionalità.

Il codice è più selvaggia di cui ha bisogno per me, soprattutto perché l'unico modo per mutare il modello prevede chiamando beginInsertRows / beginRemoveRows e rimuovendo le righe in un intervallo (solo facendo 1 riga alla volta, non c'è bisogno di ottimizzare "vicini" in una singola chiamata ancora)

Il problema con beginInsertRows / beginRemoveRows è che la rimozione di una fila potrebbe influenzare un altro QModelIndex (ad esempio, una cache in una lista). Per esempio:

ParentObj
   ->ChildObj1
   ->ChildObj2
   ->ChildObj3

Di 'seleziono ChildObj1 e ChildObj3 ed eliminarli, se tolgo ChildObj1 prima ho cambiato di ChildObj3 QModelIndex (riga è ora diverso). Problemi simili si verificano se si elimina un oggetto padre (ma non ho risolto questo da parte dei bambini "potatura" dalla lista degli oggetti).

Ecco i modi che ho pensato di lavorare intorno a questa limitazione interfaccia, ma ho pensato di chiedere uno migliore prima di forgiare avanti:

  1. Sposta "a ritroso", assumendo una lista fornita di QModelIndices è orderered dall'alto verso il basso solo andare dal basso verso l'alto. Ciò richiede in realtà l'ordinamento di essere affidabile, e il genere probabilmente sarebbe qualcosa di ingenuo e lento (forse c'è un modo intelligente di smistamento una raccolta di QModelIndexes? O si fa QItemSelectionModel fornire buoni) liste ordinate (?)

  2. Aggiornamento altri QModelIndeces ogni volta che un oggetto viene rimosso / aggiunti (non riesco a pensare a una soluzione non ingenua, una ricerca nell'elenco, ottenere nuove QModelIndeces dove necessario)

  3. Dato che l'aggiornamento dei dati reale è semplice, basta aggiornare i dati e ricostruire il modello. Questo sembra grottesca, e posso immaginare che diventando piuttosto lento con grandi insiemi di dati.

Queste sono le idee che ho ottenuto al momento. Sto lavorando su opzione 1 al momento.

Saluti, Dan O

È stato utile?

Soluzione

Si pensi beginRemoveRows / endRemoveRows, ecc come i metodi per chiedere la classe di base QAbstractItemModel per sistemare gli indici modello persistenti per voi, invece di solo un modo di aggiornare viste, e cercare di non confondere la classe base QAbstractItemModel nel suo lavoro su tali indici. Scopri http://labs.trolltech.com/page/Projects/Itemview/Modeltest di esercitare il proprio modello e vedere se si stanno mantenendo la classe di base QAbstractItemModel felice.

Dove QPersistentModelIndex non aiuta è se si desidera mantenere il vostro undo / redo dati al di fuori del modello. Ho costruito un modello che è fortemente modificato, e non volevo provare a tenere tutto nel modello. I memorizzare i dati di undo / redo nello stack di annullamento. Il problema è che se si modifica una colonna, memorizzare l'indice persistente colonna nello stack di annullamento, e quindi eliminare la riga tenendo quella colonna, indice di persistenza della colonna non è più valido.

Quello che faccio è mantenere sia un indice del modello persistente, ed una QModelIndex regolare "storico". Quando è il momento di undo / redo, controllo se l'indice persistente non è più valida. In caso affermativo, ho passare il QModelIndex storica ad un metodo speciale del mio modello di chiedere a ricreare l'indice, in base alla riga, colonna e internalPointer. Poiché tutte le mie modifiche sono sul stack di annullamento, per il momento ho sostenuto fino a quel modificare colonna a stack di annullamento, la riga è sicuro di essere lì nel modello. Tengo abbastanza statale nel internalPointer per ricreare l'indice originale.

Altri suggerimenti

Vorrei considerare l'utilizzo di un modello "all-data" e un modello di proxy filtro con il modello di dati. I dati sarebbe stato aggiunto solo per il modello all-dati, e mai rimosso. In questo modo, è possibile memorizzare la vostra undo / redo informazioni con riferimenti a quel modello. (Posso suggerire QPersistentModelIndex?). Il vostro modello di dati potrebbe anche tenere traccia di quello che dovrebbe essere mostrato, in qualche modo. Il modello di filtro sarebbe poi tornare solo informazioni per le voci che dovrebbero essere mostrati in un determinato momento.

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