在QSqlTableModel的QTableView列中显示图像

dar*_*are 7 c++ qt qtableview qtablewidgetitem

我很好奇如何在数据库中显示图像QTableView.

有没有这样的东西QTableWidgetItem我可以使用它QTableView

我用QSqlTableModel.

Tay*_*510 14

一个粗略的想法是用它QStandardItem::setData来设置一个QPixmap(转换成QVariant),然后就可以设置QStandardItemQStandardItemModel.

顺序: 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具有QVariantQPixmapQTableView根据,以使它们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()函数来自定义您自己的委托,但这需要更复杂的工作.可以在此处找到使用委托的示例.您可以使用委托绘制任何您想要的东西,甚至是按钮.

*对不起代码没有经过测试,因为我手头没有数据库.

  • 加1只猫:) (3认同)
  • @dare你应该说你在问题中使用`QSqlTableModel`. (2认同)