8

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.

4

2 回答 2

15

一个粗略的想法是用QStandardItem::setData在上面设置a 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);

在此处输入图像描述

您将不得不调整图像大小或单元格大小,具体取决于您的需要。


[编辑]

如果您正在使用QSqlTableModel,请继续使用它。我们需要做的就是将这些路径字符串放入QPixmap并将项目角色设置Qt::DecorationRole为该列中。

正如文件所说:

每个项目都有许多与之关联的数据元素,可以通过为模型的 data() 函数指定一个角色(参见 Qt::ItemDataRole)来检索它们。

要做到这一点,概念很简单:提供QTableViewof QVariantasQPixmap渲染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
}

此外,您还可以尝试子类化QStyledItemDelegate和重新实现paint()函数来自定义您自己的委托,但这将需要更复杂的工作。可以在此处找到使用委托的示例。你可以用委托绘制任何你想要的东西,甚至是一个按钮

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

于 2014-06-13T09:41:06.633 回答
-1

我有一个从 tableview 读取图像的问题,所以我找到了解决方案:

QImage name_image = table_store_multi_model_->item(i_row,0)->data(Qt::DecorationRole).value<QPixmap>().toImage();

一般我们用 读取数据data(),但是这里需要一个参数"Qt::DecorationRole";

于 2021-06-25T08:15:29.813 回答