I'm curious about how I can display an image from my database in a QTableView
.
Is there something like QTableWidgetItem
that I am able to use it in QTableView
?
I use QSqlTableModel
.
I'm curious about how I can display an image from my database in a QTableView
.
Is there something like QTableWidgetItem
that I am able to use it in QTableView
?
I use QSqlTableModel
.
一个粗略的想法是用QStandardItem::setData
在上面设置a QPixmap
(转化为QVariant
),然后就可以设置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)来检索它们。
要做到这一点,概念很简单:提供QTableView
of QVariant
asQPixmap
渲染QTableView
它们根据Qt::DecorationRole
.
您可以子类QSqlTableModel
化并重新实现虚函数QVariant data(const QModelIndex & index, int role = Qt::DisplayRole)
,并使图像列返回QPixmap
as 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()
函数来自定义您自己的委托,但这将需要更复杂的工作。可以在此处找到使用委托的示例。你可以用委托绘制任何你想要的东西,甚至是一个按钮。
*对不起,代码没有经过测试,因为我手头没有数据库。
我有一个从 tableview 读取图像的问题,所以我找到了解决方案:
QImage name_image = table_store_multi_model_->item(i_row,0)->data(Qt::DecorationRole).value<QPixmap>().toImage();
一般我们用 读取数据data()
,但是这里需要一个参数"Qt::DecorationRole";