一个粗略的想法是用QStandardItem::setData在上面设置一个QPixmap(转化为QVariant),然后你可以在QStandardItemModel上设置QStandardItem。
序列: QImage--->QPixmap--->QVariant--->QStandardItem--->QStandardItemModel
例如:
QStandardItemModel *model = new QStandardItemModel;
QImage image(":/cat/lovers/own/myCat.jpg");
QStandardItem *item = new QStandardItem();
item->setData(QVariant(QPixmap::fromImage(image)), Qt::DecorationRole);
model->setItem(0, 0, item);
ui->tableView->setModel(model);
您必须调整图像大小或单元格大小,这取决于您的需要。
[编辑]
如果您正在使用QSqlTableModel,请继续使用它。我们需要做的就是将这些路径字符串变成QPixmap,并在该列中将项目角色设置为Qt::DecorationRole。
如文件所述:
每个项目都有许多与之关联的数据元素,可以通过指定角色(参见 Qt::ItemDataRole)来检索它们
模型的 data() 函数。
要做到这一点,概念很简单:提供QTableView 和QPixmap 的QVariant 作为QTableView 根据Qt::DecorationRole 渲染它们。
您可以继承QSqlTableModel并重新实现虚函数QVariant data(const QModelIndex & index, int role = Qt::DisplayRole),并使图像列返回QPixmap为QVariant,具有装饰作用。所以做这样的事情:
QVariant CustomSqlTableModel::data(const QModelIndex &idx, int role = Qt::DisplayRole) const
{
if (idx.column() == imageColumn) {
QString imgFile = QSqlTableModel::data(idx, Qt::DisplayRole); // get path string
if (role == Qt::DisplayRole)
return QString(); // return the path string for display role
QImage image(imgFile);
/* some modification to the image, maybe */
QPixmap pixmap(imgFile);
if (role == Qt::DecorationRole)
return pixmap; // return QPixmap for decoration role
if (role == Qt::SizeHintRole)
return pixmap.size(); // in case need the image size
}
return QSqlTableModel::data( idx, role ); // use original data() outside the imageColumn
}
此外,您还可以尝试继承QStyledItemDelegate 并重新实现paint() 函数来自定义您自己的委托,但这需要更复杂的工作。可以在here 找到使用委托的示例。你可以通过委托even a button绘制任何你想要的东西。
*抱歉,代码没有经过测试,因为我手头没有数据库。