Qt 显示来自QAbstractTableModel的图像

Qt 显示来自QAbstractTableModel的图像,qt,qt4,Qt,Qt4,我试图显示来自QAbstractTableModel的图像。我尝试返回一个QPixmap作为data()的QVariant,但它只生成空单元格,而我希望第二列中的每个单元格都有一个20x20的黑色正方形 这是我目前的代码: QVariant MySqlTableModel::data(const QModelIndex &idx, int role = Qt::DisplayRole) const { if (role == Qt::DisplayRole &&

我试图显示来自
QAbstractTableModel
的图像。我尝试返回一个
QPixmap
作为
data()
QVariant
,但它只生成空单元格,而我希望第二列中的每个单元格都有一个20x20的黑色正方形

这是我目前的代码:

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

对于带有标准委托的角色
Qt::DisplayRole
,只能返回可转换为字符串的
QVariant
s

您可以通过返回角色
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);
}

或者写你自己的代表自己画。有关更多详细信息,请参阅。

是的,我认为可以通过一名代表来完成,但这似乎有些过分。我想没有更简单的办法了吧?另外,如果我只想将委托应用于特定列,是否有方法可以做到这一点?目前,我已使用setItemDelegate将委托设置为整个TableView。然后我必须在模型的data()函数和委托的paint()函数中进行列检查(查看图像显示在哪个列中)——这看起来像是代码重复。。。有更好的方法吗?更简单的方法是在不使用委托的情况下使用
Qt::DecorationRole
。但是您可以使用
setItemDelegateForColumn
为列设置委托。啊,我怎么会错过setItemDelegateForColumn呢?谢谢