我想知道如何在QTableView
中显示来自我的数据库的图像。
是否有类似于QTableWidgetItem
的东西可以用于QTableView
?
我使用QSqlTableModel
。
我想知道如何在QTableView
中显示来自我的数据库的图像。
是否有类似于QTableWidgetItem
的东西可以用于QTableView
?
我使用QSqlTableModel
。
QStandardItem::setData
,在其上设置一个转换为QVariant
的QPixmap
,然后将该QStandardItem
设置到QStandardItemModel
中。
顺序: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
。
正如文档中所说:
每个项目都有与之关联的多个数据元素,可以通过在模型的 data() 函数中指定角色 (参见 Qt::ItemDataRole) 来检索它们。
要做到这一点,概念很简单:将 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()
函数来自定义自己的委托,但这将需要更加复杂的工作。一个使用委托的例子可以在这里找到。您可以使用委托绘制任何您想要的东西,甚至是按钮。
* 对不起,代码未经测试,因为我手头没有数据库。
QSqlTableModel
。 - Tay2510我有一个问题需要从TableView中读取图像,所以我找到了以下解决方案:
QImage name_image = table_store_multi_model_->item(i_row,0)->data(Qt::DecorationRole).value<QPixmap>().toImage();
data()
读取数据,但这里需要一个参数 "Qt::DecorationRole"
。
QAbstractItemModel::data()
和Qt::DecorationRole
来查看。 - vahancho