Я хотел бы применить некоторый графический эффект к растровому изображению элемента списка в QListView.
Что я должен сделать, чтобы достичь этого?
Насколько я понимаю, мне нужно сделать свой собственный делегат для этого. Но как мне использовать в нем QGraphicsEffect?
Обновлять.
Если используется QListWidget, я могу сделать что-то со следующим эффектом. Создайте виджеты для каждого элемента списка и примените к ним нужный QGraphicsEffect. Этот виджет будет выглядеть так (например):
class PortraitViewWidget : public QFrame
{
Q_OBJECT
public:
explicit PortraitViewWidget(QWidget* parent = nullptr)
{
auto imageView = new QWidget();
auto imageViewLayout = new QVBoxLayout();
auto imageLabel = new QLabel();
auto textLabel = new QLabel();
// test defaults
imageLabel->setPixmap(QPixmap("/Lenna.png"));
imageLabel->setScaledContents(true);
static qreal quality = 0.f;
quality += 0.1752f;
if(quality > 1.f)
quality = 1.f;
textLabel->setText(QString("%1%").arg(quality * 100.f, 0, 'f', 1));
textLabel->setAlignment(Qt::AlignCenter);
textLabel->setStyleSheet(
"QLabel {"
" background-color: white;"
" color: black;"
" font-size: 16px;"
" padding: 2px; }");
imageViewLayout->addWidget(imageLabel);
imageViewLayout->addWidget(textLabel);
imageViewLayout->setMargin(0);
imageViewLayout->setSpacing(0);
imageViewLayout->setContentsMargins(0, 0, 0, 0);
imageView->setLayout(imageViewLayout);
auto effect = new QGraphicsDropShadowEffect();
effect->setBlurRadius(55);
effect->setOffset(0.f);
effect->setColor(Qt::green);
imageView->setGraphicsEffect(effect);
imageView->setSizePolicy(
QSizePolicy::Expanding,
QSizePolicy::Expanding);
imageView->setMinimumSize(240, 320);
imageView->setMaximumSize(480, 640);
auto layout = new QVBoxLayout();
layout->addWidget(imageView);
layout->setMargin(25);
setLayout(layout);
}
};
Но в этом случае мне также придется реализовать обновление данных в виджетах, чтобы отразить содержание почти вручную, и это очень утомительно. В настоящее время с QListView изменение данных в модели является простым и понятным - и я даже могу изменить используемую модель на лету. .
Есть ли способ добиться того же внешнего вида предмета? Возможно, есть шаблон реализации делегатов, который может быть применим...