2011-11-02 20 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?謝謝! –