dar*_*are 7 c++ qt qtableview qtablewidgetitem
我很好奇如何在数据库中显示图像QTableView.
有没有这样的东西QTableWidgetItem我可以使用它QTableView?
我用QSqlTableModel.
Tay*_*510 14
一个粗略的想法是用它QStandardItem::setData来设置一个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);
Run Code Online (Sandbox Code Playgroud)

您必须调整图像大小或单元格大小,具体取决于您的需要.
[编辑]
如果您正在使用QSqlTableModel,请继续使用它.我们需要做的就是将这些路径字符串放入QPixmap并将项目角色设置Qt::DecorationRole为该列.
正如文件所说:
每个项目都有许多与之关联的数据元素,可以通过为模型的data()函数指定角色(请参阅Qt :: ItemDataRole)来检索它们.
要做到这一点,这个概念很简单:提供QTableView具有QVariant的QPixmap为QTableView根据,以使它们Qt::DecorationRole.
您可以子类化QSqlTableModel并重新实现虚函数QVariant data(const QModelIndex & index, int role = Qt::DisplayRole),并使图像列返回带有装饰角色的QPixmapas 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
}
Run Code Online (Sandbox Code Playgroud)
此外,您还可以尝试子类化QStyledItemDelegate和重新实现paint()函数来自定义您自己的委托,但这需要更复杂的工作.可以在此处找到使用委托的示例.您可以使用委托绘制任何您想要的东西,甚至是按钮.
*对不起代码没有经过测试,因为我手头没有数据库.