Показать изображение в столбце QTableView из QSqlTableModel

мне интересно, как я могу отобразить изображение из моей базы данных в QTableView.

есть что-то вроде QTableWidgetItem что я могу использовать его в QTableView?

Я использую QSqlTableModel.

1 ответов


грубая идея-использовать 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);

enter image description here

вы будете иметь, чтобы изменить размер изображения или размер ячейки зависит от того, что вы необходимость.


[Edit]

если вы используете QSqlTableModel, просто продолжать использовать его. Все, что нам нужно сделать, это сделать эти строки пути в QPixmap и установите роль элемента Qt::DecorationRole в этом столбце.

как говорится в документе:

каждый элемент имеет ряд элементов данных, связанных с ним, и их можно получить, указав роль (см. Qt:: ItemDataRole) для данные модели () функция.

чтобы сделать это, концепция проста: обеспечить QTableView С QVariant of QPixmap as QTableView render их в соответствии с Qt::DecorationRole.

вы можете подкласс QSqlTableModel и переопределить виртуальную функцию QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) и сделать столбец изображения возвратить QPixmap as 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() для настройки собственного делегата, но это потребует более сложной работы. Пример использования делегата можно найти здесь. Вы можете рисовать все, что хотите с помощью delegate,даже кнопки.

*Извините, что код не протестирован, так как у меня нет базы данных под рукой.