qt QGraphicsEffect详解

一、QGraphicsEffect概述

QGraphicsEffect通过挂接到渲染管道并在源(例如QGraphicsPixmapItem、QWidget)和目标设备(例如QGraphicsView的视口)之间进行操作来更改元素的外观。它允许开发者为图形项添加各种视觉效果,如模糊、阴影、颜色化、透明度等。

二、QGraphicsEffect的子类

Qt提供了几个QGraphicsEffect的子类,用于实现不同的视觉效果:

  1. QGraphicsBlurEffect:用于产生模糊效果,减少图像的细节。通过调整模糊半径,可以控制模糊效果的强度。
  2. QGraphicsDropShadowEffect:用于为图形项添加阴影效果。可以设置阴影的偏移量、颜色、模糊半径等参数。
  3. QGraphicsColorizeEffect:用于为图形项着色。可以设置颜色的强度和要应用的颜色。
  4. 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);
}

觉得有帮助的话,打赏一下呗。。

相关推荐
小短腿的代码世界8 小时前
Qt Bluetooth源码深度解析:从HCI协议到跨平台API的完整架构
开发语言·qt·架构
小短腿的代码世界9 小时前
Qt WebEngine多进程架构与IPC通信:从Chromium多进程到Qt信号槽融合
qt·架构·系统架构
尘中远11 小时前
【Qwt 7.0 系列】快速入门与核心新特性概览 —— 更现代的 Qt 数据可视化库
qt·数据可视化·绘图·qwt·科学绘图
初阳78513 小时前
【Qt】系统相关(3)——多线程
qt
初阳78516 小时前
【Qt】系统相关(2)——文件
开发语言·qt
尘中远1 天前
【Qwt 7.0 系列】坐标轴与刻度系统 —— 刻度引擎、网格、图例与刻度朝内
qt·数据可视化·qcustomplot·qwt·工业软件·科学绘图
sycmancia1 天前
Qt——多线程间的互斥
开发语言·qt
尘中远2 天前
【Qwt 7.0 系列】常用图表类型实战 —— 柱状图、散点图、箱线图与直方图
qt·qwt·工业软件·科学绘图
尘中远2 天前
【Qwt 7.0 系列】交互功能详解 —— 平移、缩放、坐标轴交互与数据拾取
qt·数据可视化·绘图·qcustomplot·qwt·科学绘图
sycmancia2 天前
Qt——进程与线程的概念
qt