一、QGraphicsEffect概述
QGraphicsEffect通过挂接到渲染管道并在源(例如QGraphicsPixmapItem、QWidget)和目标设备(例如QGraphicsView的视口)之间进行操作来更改元素的外观。它允许开发者为图形项添加各种视觉效果,如模糊、阴影、颜色化、透明度等。
二、QGraphicsEffect的子类
Qt提供了几个QGraphicsEffect的子类,用于实现不同的视觉效果:
- QGraphicsBlurEffect:用于产生模糊效果,减少图像的细节。通过调整模糊半径,可以控制模糊效果的强度。
- QGraphicsDropShadowEffect:用于为图形项添加阴影效果。可以设置阴影的偏移量、颜色、模糊半径等参数。
- QGraphicsColorizeEffect:用于为图形项着色。可以设置颜色的强度和要应用的颜色。
- QGraphicsOpacityEffect:用于设置图形项的透明度。可以调整透明度值,并可以使用渐变蒙版来定义透明度的变化。
三、常用方法
- void setEnabled(bool enabled);
启用或禁用效果。
- bool isEnabled()const;
检查效果是否启用。
- void update();
更新效果,强制重新绘制。
- void draw(OPainter *painter);
纯虚函数,所有子类需要实现以绘制附加效果。
- ORectF boundingRect() const;
返回应用了效果后的边界矩形。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QApplication>
#include <QGraphicsPixmapItem>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent),
graphicsView(new QGraphicsView(this)),
graphicsScene(new QGraphicsScene(this)),
pixmapItem(new QGraphicsPixmapItem(QPixmap(":/res/c.png"))),
blurButton(new QPushButton("Apply Blur Effect", this)),
colorizeButton(new QPushButton("Apply Colorize Effect", this)),
shadowButton(new QPushButton("Apply Drop Shadow Effect", this)),
opacityButton(new QPushButton("Apply Opacity Effect", this))
{
resize(800, 480);
QVBoxLayout *layout = new QVBoxLayout;
graphicsScene->addItem(pixmapItem);
graphicsView->setScene(graphicsScene);
layout->addWidget(graphicsView);
layout->addWidget(blurButton);
layout->addWidget(colorizeButton);
layout->addWidget(shadowButton);
layout->addWidget(opacityButton);
QWidget *container = new QWidget;
container->setLayout(layout);
setCentralWidget(container);
connect(blurButton, &QPushButton::clicked, this, &MainWindow::applyBlurEffect);
connect(colorizeButton, &QPushButton::clicked, this, &MainWindow::applyColorizeEffect);
connect(shadowButton, &QPushButton::clicked, this, &MainWindow::applyDropShadowEffect);
connect(opacityButton, &QPushButton::clicked, this, &MainWindow::applyOpacityEffect);
}
MainWindow::~MainWindow()
{
}
void MainWindow::applyBlurEffect()
{
QGraphicsBlurEffect *blurEffect = new QGraphicsBlurEffect;
blurEffect->setBlurRadius(10);
pixmapItem->setGraphicsEffect(blurEffect);
}
void MainWindow::applyColorizeEffect()
{
QGraphicsColorizeEffect *colorizeEffect = new QGraphicsColorizeEffect;
colorizeEffect->setColor(Qt::blue);
pixmapItem->setGraphicsEffect(colorizeEffect);
}
void MainWindow::applyDropShadowEffect()
{
QGraphicsDropShadowEffect *shadowEffect = new QGraphicsDropShadowEffect;
shadowEffect->setBlurRadius(10);
shadowEffect->setOffset(5,5);//阴影与原有图形的间距
shadowEffect->setColor(Qt::green);
pixmapItem->setGraphicsEffect(shadowEffect);
}
void MainWindow::applyOpacityEffect()
{
QLinearGradient alphaGradient(pixmapItem->boundingRect().topLeft(), pixmapItem->boundingRect().bottomLeft());
alphaGradient.setColorAt(0.0, Qt::transparent);
alphaGradient.setColorAt(0.5, Qt::black);
alphaGradient.setColorAt(1.0, Qt::transparent);
QGraphicsOpacityEffect *blur = new QGraphicsOpacityEffect(this);
blur->setOpacity(0.5);//透明度设置该值应该在0.0到1.0的范围内,其中0.0是完全透明的,1.0是完全不透明的。
blur->setOpacityMask(alphaGradient);//蒙版设置,透明度和蒙版可单独设置
pixmapItem->setGraphicsEffect(blur);
}
觉得有帮助的话,打赏一下呗。。