【发布时间】:2014-05-16 14:40:58
【问题描述】:
我想对 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 更改模型中的数据非常简单明了 - 我什至可以更改使用过的模型在飞行中。
有没有办法实现相同的项目外观?也许有一种实现委托的模式可能适用......
【问题讨论】:
-
你能再具体一点吗?什么包含您的 QListView?你想定制它的外观(就像你提到的那样在代表中)?如果你想添加“效果”,你可能有一些已经在运行的代码,把它放在这里肯定会帮助我们理解这个问题。