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