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:

alt text

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.

È stato utile?

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 e setData.
      • rowCount e columnCount 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 rendimenti data 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 in QVariant.
        • 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. Tornando Qt.Checked visualizzerà una casella di controllo selezionata, e Qt.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 a data. Si dovrebbe gestire i ruoli si Manipolare data:. Qt.DisplayRole per i dati reali, e Qt.CheckStateRole per le caselle di controllo

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ì:. Vedi QAbstractView.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 ciclo for.

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:

Stella Delegato Esempio
Spin Box Delegato Esempio

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