2011-11-02 36 views
6

我想显示一个图像从QAbstractTableModel。我试过返回一个QPixmap作为QVariantdata(),但它只产生空单元格,当我预计第二列中的每个单元格都有一个20x20的黑色正方形。显示QAbstractTableModel的图像

这是目前我的代码:

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

回答

5

只有QVariant可转换为字符串s可以为角色Qt::DisplayRole与标准委托返回。

您可以通过返回它的作用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); 
} 

显示图像或自己写的委托做画自己。有关更多详细信息,请参见QStyledItemDelegate documentation

+0

是的,我认为它可以与代表完成,但这似乎是矫枉过正。我想没有更简单的方法?另外,如果我只想将代表应用于特定列,是否有办法做到这一点?目前我已经使用setItemDelegate将委托设置为整个TableView。然后,我必须在模型的data()函数以及委托的paint()函数中进行列检查(查看显示图像的列) - 这看起来像代码重复...在那里更好的方法? –

+0

更简单的方法是在不使用委托的情况下使用'Qt :: DecorationRole'。但是你可以用'setItemDelegateForColumn'设置一个列的委托。 – alexisdm

+0

啊,我怎么会错过setItemDelegateForColumn?谢谢! –