Я хотел ответить на этот вопрос, надеясь, что это также будет полезно для других.Как предложил Джереми Фризнер, лучший (и быстрый по сравнению с QItemDelegate
) способ отправки изображений в QTableView
с помощью QPushButton
- это изменение функции void MainWindow::addData()
с помощью QImage
и ее передачав setData(QVariant(QPixmap::fromImage), Qt::DecorationRole)
, так что вся функция может быть записана следующим образом:
ПЕРВЫЙ ВАРИАНТ :
void MainWindow::on_sendBtn_clicked()
{
addData();
}
void MainWindow::addData()
{
QStandardItem *pathAItem = new QStandardItem(ui->pathLineEdit_A->text());
QStandardItem *pathBItem = new QStandardItem(ui->pathLineEdit_B->text());
QImage image1(ui->graphicsViewLeft->grab().toImage());
QStandardItem *item1 = new QStandardItem();
item1->setData(QVariant(QPixmap::fromImage(image1.scaled(42,42, Qt::KeepAspectRatio,Qt::SmoothTransformation))), Qt::DecorationRole);
ui->bookMarkTableView->setModel(model);
QImage image2(ui->graphicsViewRight->grab().toImage());
QStandardItem *item2 = new QStandardItem();
item2->setData(QVariant(QPixmap::fromImage(image2.scaled(42,42, Qt::KeepAspectRatio,Qt::SmoothTransformation))), Qt::DecorationRole);
ui->bookMarkTableView->setModel(model);
QList<QStandardItem*> row;
row << pathAItem << pathBItem << item1 << item2;
model->appendRow(row);
}
ВТОРОЙ ВАРИАНТ
Если необходимо использовать QItemDelgate
Я также публикую эту часть кода (она работает, как я уже пробовал):
В imagedelegate.h необходимо предоставить QSize
следующим образом:
class ImageDelegate : public QStyledItemDelegate
{
public:
ImageDelegate(QObject * parent = nullptr);
void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const;
QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const;
После этого на вашем imagedelegate.cpp реализация:
#include "imagedelegate.h"
ImageDelegate::ImageDelegate(QObject * parent) : QStyledItemDelegate(parent)
{}
QSize ImageDelegate::sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const
{
return QSize(32,32);
Q_UNUSED(option);
Q_UNUSED(index);
}
void ImageDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
{
qDebug() << (index.model()->headerData(index.column(), Qt::Horizontal).toString());
QString colName = index.model()->headerData(index.column(), Qt::Horizontal).toString();
if(colName == "image1" || colName == "image2")
{
QPixmap iconPix;
if(!iconPix.loadFromData(index.model()->data(index).toByteArray())) {
}
iconPix = iconPix.scaledToHeight(32);
painter->drawPixmap(option.rect.x(),option.rect.y(),iconPix);
} else {
QStyledItemDelegate::paint(painter, option, index);
}
}
В моем случаеУ меня было два столбца, в которых мне нужно было сохранить изображения, так что вы можете расширить его на сколько угодно столбцов, и я также установил QSize
из (32,32)
, но это зависит от разработчика.
Я надеюсь, что это сэкономит ваше время на программирование, и это - конечный результат!:)