从QSqlTableModel中显示图像在QTableView的一列

8

我想知道如何在QTableView中显示来自我的数据库的图像。

是否有类似于QTableWidgetItem的东西可以用于QTableView

我使用QSqlTableModel


你可以结合使用QAbstractItemModel::data()Qt::DecorationRole来查看。 - vahancho
你的数据库是什么形式?那是一堆图像路径吗? - Tay2510
是的,这是一条路径,但如果我将图像存储为BLOB,会有什么区别吗? - dare
2个回答

15
一个简单的思路是使用QStandardItem::setData,在其上设置一个转换为QVariantQPixmap,然后将该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) 来检索它们。

要做到这一点,概念很简单:将 QPixmapQVariant 提供给 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() 函数来自定义自己的委托,但这将需要更加复杂的工作。一个使用委托的例子可以在这里找到。您可以使用委托绘制任何您想要的东西,甚至是按钮

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


我应该如何使用QStandardItemModel和QSqlTableModel? - dare
2
@dare 你应该在问题中说明你正在使用 QSqlTableModel - Tay2510
6
给猫加一分 :) - Dmitry Sazonov
顺便问一下,@Tay2510,我需要一个好的学习Qt的来源。你能推荐一个好的吗? - dare
1
对于书籍:如果你想学习Qt的工作机制,可以尝试《An Introduction to Design Patterns in C++ with Qt 4》;如果想学习如何使用Qt,则可以尝试《C++ GUI Programming with Qt 4》。对于非书籍资源:最好的资源是Qt官方文档(http://qt-project.org/doc/)本身;[Qt centre forum](http://www.qtcentre.org/content/)也是一个很好的提问平台。此外,你还可以查看这个[问题](https://dev59.com/CHI95IYBdhLWcg3wwwyY),那里有一些不错的在线学习资源。 - Tay2510
显示剩余2条评论

-1

我有一个问题需要从TableView中读取图像,所以我找到了以下解决方案:

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

通常我们使用 data() 读取数据,但这里需要一个参数 "Qt::DecorationRole"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接