2011-11-02 36 views
6

QAbstractTableModelからイメージを表示しようとしています。私はQPixmapQVariantdata()として返そうとしましたが、2番目の列のすべてのセルが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を逃すことができますか?ありがとう! –

関連する問題