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);
}

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

相关推荐
范纹杉想快点毕业17 分钟前
以项目的方式学QT开发(一)——超详细讲解(120000多字详细讲解,涵盖qt大量知识)逐步更新!
c语言·数据结构·c++·git·qt·链表·github
钢铁男儿1 小时前
PyQt 探索QMainWindow:打造专业的PyQt5主窗
python·qt·pyqt
破晓的历程6 小时前
Qt file文件操作详解
开发语言·qt
躺着听Jay8 小时前
QT设置MySQL驱动
数据库·qt
范纹杉想快点毕业8 小时前
以项目的方式学QT开发(三)——超详细讲解(120000多字详细讲解,涵盖qt大量知识)逐步更新!
c语言·开发语言·c++·qt·mysql·算法·命令模式
机器视觉知识推荐、就业指导9 小时前
Qt/C++面试【速通笔记九】—视图框架机制
c++·笔记·qt
C++ 老炮儿的技术栈18 小时前
什么是函数重载?为什么 C 不支持函数重载,而 C++能支持函数重载?
c语言·开发语言·c++·qt·算法
名誉寒冰20 小时前
# KVstorageBaseRaft-cpp 项目 RPC 模块源码学习
qt·学习·rpc
xiaoyaoyou.xyz21 小时前
嵌入式Linux Qt开发:1、搭建基于ubuntu18.04的Qt开发环境及测试(解决Qt creator输入法问题)
linux·qt
小龙Guo1 天前
QT+opencv实现卡尺工具找圆、拟合圆
开发语言·qt·opencv