【问题标题】:Show image in a column of QTableView from QSqlTableModel在 QSqlTableModel 的 QTableView 列中显示图像
【发布时间】:2014-08-03 19:21:40
【问题描述】:

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

有没有像QTableWidgetItem 这样我可以在QTableView 中使用的东西?

我使用QSqlTableModel

【问题讨论】:

  • 您可以结合Qt::DecorationRole查看QAbstractItemModel::data()
  • 你的数据库是什么形式的?那是一堆图片路径吗?
  • 是的,它是一条路径,但是如果我将图像存储为 BOLB 会有所不同吗?

标签: c++ qt qtableview qtablewidgetitem


【解决方案1】:

一个粗略的想法是用QStandardItem::setData在上面设置一个QPixmap(转化为QVariant),然后你可以在QStandardItemModel上设置QStandardItem

序列: 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

如文件所述:

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

要做到这一点,概念很简单:提供QTableViewQPixmapQVariant 作为QTableView 根据Qt::DecorationRole 渲染它们。

您可以继承QSqlTableModel并重新实现虚函数QVariant data(const QModelIndex & index, int role = Qt::DisplayRole),并使图像列返回QPixmapQVariant,具有装饰作用。所以做这样的事情:

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() 函数来自定义您自己的委托,但这需要更复杂的工作。可以在here 找到使用委托的示例。你可以通过委托even a button绘制任何你想要的东西。

*抱歉,代码没有经过测试,因为我手头没有数据库。

【讨论】:

  • 我应该如何将 QStandardItemModel 与 QSqlTableModel 一起使用?
  • @dare 你应该说你在问题中使用QSqlTableModel
  • 猫加 1 :)
  • @Tay2510 有没有办法同时使用它们 QStandardItemModel 和 QSqltableModel?
  • 书籍:如果你想了解Qt的工作机制,试试An Introduction to Design Patterns in C++ with Qt 4;要了解如何使用 Qt,请尝试 C++ GUI Programming with Qt 4对于非图书资源: 最好的就是Qt official documentit self; Qt centre forum 也是提问的好地方。另外,您可以查看asked question,那里可以找到一些很好的在线学习资源。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-06-13
    • 1970-01-01
    • 2011-04-30
    • 2013-01-14
    • 1970-01-01
    • 2019-03-11
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多