Incorporare un controllo in un QTableView?
Domanda
Sto lavorando una piccola applicazione qt (utilizzando PyQt4) e mi è venuta in mente un'idea, ma io sono sicuro di come per la sua attuazione. Ho un QTableView che rappresenta alcuni dati e vorrei aggiungere un'altra colonna alla QTableView che contiene un controllo casella di controllo che potrebbe essere collegato fino a qualche pezzo del modello. Ad esempio, qualcosa di simile a questo:
Si noti la colonna Elimina ha un widget casella di controllo per ogni riga (anche se questo è un applicazione web, non un desktop Qt app, il principale è lo stesso). I punti di bonus se posso selezionare più righe, fare clic destro e scegliere "selezionare / deselezionare Selected".
Se tutto questo non è chiaro, rilasciare un commento qui e ti chiarire.
Soluzione
implementare il proprio modello da tavolo è più lavoro rispetto all'utilizzo QStandardItemModel
(come @Andy raccomanda), ma ti dà un buon controllo su ciò che si vuole fare, quindi cercherò di darvi una sintesi di cosa fare . Suppongo che tu sai tutto di documentazione di Qt e documentazione relativa alla classe di PyQt e può cercare qualunque cosa le classi che vi serve. (I può essere overexplaining se si dispone già di un QTableView
ma meglio che lasciare qualcosa, credo.)
Per ottenere gli stati controllabili:
- Crea una sottoclasse di
QTableModel
.- Seleziona una certa struttura di dati per memorizzare il contenuto delle righe. Questo può essere piuttosto semplice (una grande lista interna), o complesso come un database SQL (in questo caso vedere
QSqlTableModel
invece). - Override
rowCount
,columnCount
,data
esetData
.-
rowCount
ecolumnCount
corrispondono abbastanza direttamente a quello che si usa per un modello di dati. Se fondamentalmente si utilizza una matrice 2D (o lista di liste), possono essere il più breve one-liners. -
data
è dove le cose si fanno interessanti. modelli dell'articolo nel negozio diversi campi (che chiamate Qt ruoli ) e quali rendimentidata
dipende da ciò che il ruolo che viene richiesto. Si noti che parlo di tipi di dati di ciò che è tornato, ma ha sempre bisogno di essere avvolti inQVariant
.-
Qt.DisplayRole
è tutto ciò che il testo viene visualizzato nelle celle della tabella. Questo è i dati effettivi, ed è di gran lunga il caso comune (in modo che questo è il ruolo predefinito). -
Qt.CheckStateRole
è un valore booleano. TornandoQt.Checked
visualizzerà una casella di controllo selezionata, eQt.Unchecked
restituirà un uno incontrollato. Se tutto quello che volete una colonna per contenere sono le caselle di controllo gestire solo questo ruolo. - Gli altri ruoli sono utili per le icone, per colori di sfondo, e una serie di altre caratteristiche, ma questi.
- Ogni ruolo non gestita dovrebbe restituire un
QVariant
.
-
-
setData
è simmetrica adata
. Si dovrebbe gestire i ruoli si Manipolaredata
:.Qt.DisplayRole
per i dati reali, eQt.CheckStateRole
per le caselle di controllo
-
- Seleziona una certa struttura di dati per memorizzare il contenuto delle righe. Questo può essere piuttosto semplice (una grande lista interna), o complesso come un database SQL (in questo caso vedere
Per consentire la selezione multipla di righe e colonne e celle. Per fare questo si vuole capire modelli di selezione . La versione corta è:
- Imposta il Modalità di selezione sulla vista tabella:
view.setSelectionMode( QAbstractItemView.ContiguousSelection
). Questo vi permetterà di evidenziare le celle contigue. È possibile evidenziare le cellule arbitrari così:. VediQAbstractView.SelectionMode
- Per determinare le celle effettivamente selezionata dopo un'azione chiedere visualizzazione tabella per il modello selezione (notare la 'l' ):
view.selectionModel().selectedIndexes()
. È possibile scorrere questi con un ciclofor
.
Per consentire tasto destro del mouse:
- Override
contextMenuEvent
del vostro punto di vista. - Crea un
QMenu
e collegarlo a qualsiasi slot è necessario.
Per una comprensione più approfondita leggere il Qt guidare al modello / Vista se non l'hai già. E sicuramente guardare ai Qt vista elementi esempi . Molti di quelli descrivono sono implementate in PyQt in molto meno codice (compresi i due @Jesse menzioni), e gli esempi modello albero riporto di tavoli, ma con molto meno lavoro (è necessario implementare molto meno, come descritto in precedenza.)
Altri suggerimenti
Si potrebbe anche avere uno sguardo alla QStandardItemModel, che vi dà un'interfaccia per interagire con gli elementi attraverso uno stato di "verificabile"!
Si potrebbe anche ereditare da QAbstractItemModel e utilizzare il ruolo Qt :: CheckStateRole ...
In Qt / C ++ è possibile creare un delegato per gli oggetti personalizzati in una colonna. Vorrei assumere che si può fare qualcosa di molto simile a PyQt. Vedere i seguenti esempi: