Показать изображение в столбце 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);

вы будете иметь, чтобы изменить размер изображения или размер ячейки зависит от того, что вы необходимость.
[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,даже кнопки.
*Извините, что код не протестирован, так как у меня нет базы данных под рукой.