2011-11-02 9 views
6

Estoy tratando de mostrar una imagen de QAbstractTableModel. Traté de devolver un QPixmap como QVariant de data(), pero solo produce celdas vacías, cuando esperaba que cada celda de la segunda columna tuviera un cuadrado negro de 20x20.Mostrar una imagen de un QAbstractTableModel

Este es mi código actualmente:

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); 
} 

Respuesta

5

Sólo QVariant s que se pueden convertir en cadena se pueden volver para el papel Qt::DisplayRole con el delegado estándar.

le puede mostrar la imagen devolviéndolo para el papel 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 escribir su propio delegado de hacer que pinte usted. Ver QStyledItemDelegate documentation para más detalles.

+0

Sí, pensé que podría hacerse con un delegado, pero eso parecía exagerado. ¿Supongo que no hay una manera más fácil? Además, si solo quiero aplicar el delegado a una columna específica, ¿hay alguna manera de hacerlo? Actualmente he configurado el delegado para toda TableView utilizando setItemDelegate. Luego tengo que hacer la comprobación de columna (para ver en qué columna se muestran las imágenes) en la función de datos() del modelo, así como la función paint() del delegado: esto parece una duplicación de código ... ¿hay ¿una mejor manera? –

+0

La manera más fácil es usar 'Qt :: DecorationRole' sin usar un delegado. Pero puede establecer un delegado para una columna con 'setItemDelegateForColumn'. – alexisdm

+0

Ah, ¿cómo podría perderse setItemDelegateForColumn? ¡Gracias! –