2011-11-02 5 views
6

Sto tentando di visualizzare un'immagine da QAbstractTableModel. Ho provato a restituire uno QPixmap come QVariant di data(), ma produce solo celle vuote, quando mi aspetto che ogni cella nella seconda colonna abbia un quadrato nero 20x20.Visualizzazione di un'immagine da un QAbstractTableModel

Questo è il mio codice attualmente:

QVariant MySqlTableModel::data(const QModelIndex &idx, int role = Qt::DisplayRole) const 
{ 
    if (role == Qt::DisplayRole && idx.column() == 1) { 
     QPixmap pixmap(20,20); 
     QColor black(0,0,0); 
     pixmap.fill(black); 
     return pixmap; 
    } 

    return QSqlTableModel::data(idx, role); 
} 

risposta

5

Solo QVariant s che può essere convertito a stringa possono essere restituiti per il ruolo Qt::DisplayRole con il delegato standard.

È possibile visualizzare l'immagine restituendo per il ruolo Qt::DecorationRole

QVariant MySqlTableModel::data(const QModelIndex &idx, int role = Qt::DisplayRole) const 
{ 
    if (idx.column() == 1) { 
     if (role == Qt::DecorationRole) { 
      QPixmap pixmap(20,20); 
      QColor black(0,0,0); 
      pixmap.fill(black); 
      return pixmap; 
     } else if (role == Qt::DisplayRole) { 
      // For Qt::DisplayRole return an empty string, otherwise 
      // you will have *both* text and image displayed. 
      return ""; 
     } 
    } 

    return QSqlTableModel::data(idx, role); 
} 

O scrivere il proprio delegato a fare la pittura da soli. Vedi QStyledItemDelegate documentation per maggiori dettagli.

+0

Sì, ho pensato che si potesse fare con un delegato, ma sembrava eccessivo. Immagino che non ci sia un modo più semplice? Inoltre, se voglio solo applicare il delegato a una colonna specifica, c'è un modo per farlo? Attualmente ho impostato il delegato sull'intero TableView utilizzando setItemDelegate. Quindi devo fare il controllo della colonna (per vedere in quale colonna vengono visualizzate le immagini) nella funzione data() del modello, nonché la funzione paint() del delegato: sembra una duplicazione del codice ... è lì un modo migliore? –

+0

Il modo più semplice è usare 'Qt :: DecorationRole' senza usare un delegato. Ma puoi impostare un delegato per una colonna con 'setItemDelegateForColumn'. – alexisdm

+0

Ah, come potrei perdere setItemDelegateForColumn? Grazie! –