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

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

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

я использую QSqlTableModel,

6

Решение

Грубая идея заключается в использовании 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() функция для настройки вашего собственного делегата, но это потребует более сложной работы. Пример использования делегата можно найти Вот. Вы можете рисовать все, что вы хотите с делегатом, даже кнопка.

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

13

Другие решения


По вопросам рекламы [email protected]