Come faccio a dire Qt per mostrare sempre un editore in un QTableView?
-
22-08-2019 - |
Domanda
Ho una QTableView per il quale voglio visualizzare l'ultima colonna sempre in modalità di modifica. (E 'un QComboBox in cui l'utente dovrebbe essere in grado di cambiare sempre il valore.)
Penso che ho visto la soluzione nel Qt documentazione , ma posso 't trovare più. C'è un modo semplice per farlo?
credo che avrei potuto archiviare questo effetto utilizzando openPersistentEditor()
per ogni cellula, ma sto cercando un modo migliore. (Come specificando solo una volta per l'intera colonna.)
Soluzione
Ci sono due possibilità:
setIndexWidget
, ma Trolltech scrive:
Questa funzione dovrebbe essere utilizzata solo per immagini statiche all'interno area visibile corrispondente ad un elemento dei dati. Se si desidera visualizzare su misura contenuti dinamici o implementare un custom widget di editore, QItemDelegate sottoclasse invece.
(E si rompe il Model / View modello ...)
metodo paint
di un delegato . Ma qui si deve implementare tutto come te abilitati / elementi disabili.
Altri suggerimenti
Un modo per ottenere il comportamento montaggio automatico è quello di chiamare la funzione setEditTriggers della vista () con il valore QAbstractItemView :: AllEditTriggers.
Per visualizzare il contenuto di una data colonna in un certo modo, dare un'occhiata a QAbstractItemView :: setItemDelegateForColumn (). Questo vi permetterà di specificare un delegato personalizzato solo per quelle voci che ne hanno bisogno. Tuttavia, non creerà automaticamente un widget redattore per ciascuno di essi (ci potrebbe in linea di principio essere migliaia di loro), ma si potrebbe usare il delegato per rendere ogni elemento in un modo che lo fa apparire come un widget editore.
Il QAbstractItemModel :: bandiere funzione virtuale è chiamata a verificare se un elemento è modificabile (vedi Qt :: ItemIsEditable ). Date un'occhiata a Rendere il modello modificabile nel Model / View Programmazione documentazione.
Non riesco a vedere un modo semplice per fare questo, ma si potrebbe essere in grado di gestire tramite un delegato. Onestamente non so esattamente come avrebbe funzionato, ma si dovrebbe essere in grado di ottenere qualcosa di lavoro se si tenta già abbastanza difficile. Se si ottiene un delegato corretta, si dovrebbe essere in grado di impostare su una vista intera, una cella di una visione, o semplicemente una colonna o riga.