Мне интересно, как я могу отобразить изображение из моей базы данных в QTableView
,
Есть ли что-то вроде QTableWidgetItem
что я могу использовать его в QTableView
?
я использую QSqlTableModel
,
Грубая идея заключается в использовании 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);
Вам придется изменить размер изображения или размер ячейки, в зависимости от того, что вам нужно.
[Редактировать]
Если вы используете QSqlTableModel
Просто продолжайте использовать это. Все, что нам нужно сделать, это сделать эти строки пути в QPixmap
и установите роль элемента, чтобы быть Qt::DecorationRole
в этом столбце.
Как говорится в документе:
Каждый элемент имеет ряд элементов данных, связанных с ним, и их можно получить, указав роль (см. Qt :: ItemDataRole) для
Функция data () модели.
Для этого концепция проста: предоставить QTableView
с QVariant
из QPixmap
как 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()
функция для настройки вашего собственного делегата, но это потребует более сложной работы. Пример использования делегата можно найти Вот. Вы можете рисовать все, что вы хотите с делегатом, даже кнопка.
* Извините, код не проверен, так как у меня нет базы данных под рукой.