QT之QGraphicsOpacityEffect

此篇文章来源于自己在学习Qt的过程中遇到想改变背景的透明度的问题,从而遇到QGraphicsOpacityEffect类,为了方便进一步学习此类,故写下此篇文章。本人能力有限,若文章当中出现任何问题,欢迎大家评论区讨论,共同学习,一起进步。

一、QGraphicsOpacityEffect介绍

QGraphicsOpacityEffect 是Qt框架中的一个类,主要用于为 QGraphicsItem 提供透明度效果。在图形视图框架(Graphics View Framework)中,如果你想要控制场景中某个图形项的不透明度,就可以使用QGraphicsOpacityEffect。

通过设置QGraphicsOpacityEffect对象的opacity属性,可以指定关联的QGraphicsItem的透明度,范围从0.0(完全透明)到1.0(完全不透明)。(博主尝试了,并不是只能关联QGraphicsItem,你可以关联ui界面上的几乎所有的控件都可以)

注意:如果你只是创建了,但是没有指定不透明度的大小,不透明度并不是1.0,系统有一个默认值,据QT官方文档介绍此默认值是0.7

创建一个QGraphicsOpacityEffect并将其应用于QGraphicsItem的代码如下:

#include <QGraphicsOpacityEffect>
#include <QGraphicsRectItem>
#include <QGraphicsScene>
#include <QGraphicsView>

// 假设是在某个函数内部操作
void setupGraphicsOpacityEffect() {
    // 创建一个矩形项
    QGraphicsRectItem* rectItem = new QGraphicsRectItem(0, 0, 100, 100);
    rectItem->setBrush(QBrush(Qt::red)); // 设置填充颜色为红色

    // 创建透明度效果对象
    QGraphicsOpacityEffect* opacityEffect = new QGraphicsOpacityEffect();
    opacityEffect->setOpacity(0.5); // 设置透明度为50%

    // 将透明度效果应用到矩形项上
    rectItem->setGraphicsEffect(opacityEffect);

    // 创建一个场景并将矩形项添加进去
    QGraphicsScene* scene = new QGraphicsScene();
    scene->addItem(rectItem);

    // 创建一个视图并连接场景
    QGraphicsView* view = new QGraphicsView(scene);
    // 可能还需要设置视图的一些属性,比如大小、位置等
    view->setGeometry(0, 0, 400, 400); // 假设视图大小为400x400像素
    // ...
}

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 调用函数来设置透明效果并展示
    setupGraphicsOpacityEffect();

    // 显示视图
    QGraphicsView* view = ... // 获取或创建视图实例
    view->show();

    return app.exec();
}

二、成员函数

1、QGraphicsOpacityEffect::QGraphicsOpacityEffect(QObject *parent = nullptr)

QGraphicsOpacityEffect::QGraphicsOpacityEffect(QObject *parent = nullptr)是QGraphicsOpacityEffect类的构造函数,用于创建一个新的QGraphicsOpacityEffect对象实例。

  • QObject *parent: 指向父对象的指针,默认为nullptr。在Qt中,对象通常采用父对象/子对象的层次结构进行内存管理。如果提供了父对象,那么当父对象被删除时,该QGraphicsOpacityEffect对象也会自动被删除,从而避免了内存泄漏的问题。

所以,当你创建一个QGraphicsOpacityEffect对象时,可以像这样简单地初始化:

QGraphicsOpacityEffect* opacityEffect = new QGraphicsOpacityEffect(nullptr);

或者如果希望它关联到某个QObject作为父对象:

QGraphicsItem* item = ...; // 假设有一个QGraphicsItem对象
QGraphicsOpacityEffect* opacityEffect = new QGraphicsOpacityEffect(item);

博主喜欢用第二个直接进行关联使用。

2、void QGraphicsOpacityEffect::opacityChanged(qreal opacity)

void QGraphicsOpacityEffect::opacityChanged(qreal opacity) 是 QGraphicsOpacityEffect 类的一个信号。当图形项的不透明度发生变化时,此信号会被发射。

信号参数 qreal opacity 表示新的不透明度值,范围从0.0(完全透明)到1.0(完全不透明)。

你可以

QGraphicsOpacityEffect *effect = new QGraphicsOpacityEffect();
QObject::connect(effect, &QGraphicsOpacityEffect::opacityChanged, [=](qreal newOpacity){
    qDebug() << "Opacity changed to:" << newOpacity;
});

连接到这个信号来监视或响应不透明度的变化,例如:

在这段代码中,每当effect对象的不透明度改变时,都会打印出新的不透明度值。

3、void QGraphicsOpacityEffect::opacityMaskChanged(const QBrush &mask)

void QGraphicsOpacityEffect::opacityMaskChanged(const QBrush &mask)同样是QGraphicsOpacityEffect类的一个信号。当图形项的不透明度蒙版(opacity mask)发生变化时,此信号会被触发。

信号参数const QBrush &mask表示新的不透明度蒙版。不透明度蒙版允许你根据图像上的特定区域来定义不同部分的透明度,例如,可以通过使用一个QPixmap或QImage来精确控制哪些像素应当透明,哪些像素应当保持不透明。

以下是一个简单的示例,展示了如何连接到这个信号:

QGraphicsOpacityEffect *effect = new QGraphicsOpacityEffect();
QBrush opacityMask(QPixmap("mask.png")); // 假设有一个名为"mask.png"的透明度蒙版图片
effect->setOpacityMask(opacityMask);

QObject::connect(effect, &QGraphicsOpacityEffect::opacityMaskChanged, [=](const QBrush &newMask){
    qDebug() << "Opacity mask changed to a new mask.";
    // 这里可以进一步处理新蒙版,如保存、绘制或更新相关状态等
});

在这个示例中,一旦给effect对象设置了一个新的不透明度蒙版,就会触发opacityMaskChanged信号,并执行相应的槽函数。不过要注意的是,QGraphicsOpacityEffect实际上并不支持直接设置opacityMask,上述代码仅为概念性演示如何使用类似信号。 若要达到类似的局部透明效果,可能需要结合QPainter和QGraphicsItem的绘图机制或其他Qt特性来实现。

4、QGraphicsOpacityEffect::~QGraphicsOpacityEffect()

QGraphicsOpacityEffect::~QGraphicsOpacityEffect() 是 QGraphicsOpacityEffect 类的析构函数。在C++中,析构函数用于销毁对象并释放其占用的资源。当一个 QGraphicsOpacityEffect 对象生命周期结束,即该对象不再被使用且即将离开其作用域,或者明确地被删除时,系统会自动调用析构函数。

在 QGraphicsOpacityEffect 的析构函数中,它会负责清理与该对象相关的所有内部数据结构以及释放可能分配的任何内存资源。由于这是一个Qt库中的类,它的具体实现可能会涉及到解除与其他Qt对象的连接,停止任何正在进行的效果动画以及其他必要的清理工作,确保不会发生内存泄漏或者其他资源未释放的问题。

5、void QGraphicsOpacityEffect::draw(QPainter *painter)  [override virtual protected]

QGraphicsOpacityEffect::draw(QPainter *painter) 是一个在 Qt 框架中用于绘制带有透明度效果的图形的方法。QGraphicsOpacityEffect 类是 Qt 提供的一个效果类,用于为图形项(QGraphicsItem)添加透明度效果。

当你调用这个方法时,它会在给定的 QPainter 对象上绘制应用了透明度效果的图形。这个方法通常是在 QGraphicsOpacityEffect 的内部被调用的,而不是由开发者直接调用。

这里的 QPainter 是一个用于在 Qt 中进行低级绘制的类。通过它,你可以绘制形状、路径、图像等。

当你使用 QGraphicsOpacityEffect 时,你通常会设置透明度级别,然后将其应用于某个图形项。这个图形项在渲染时,其外观会根据所设置的透明度级别进行调整。

需要注意的是,虽然 QGraphicsOpacityEffect::draw(QPainter *painter) 方法存在,但通常开发者不需要直接调用它。相反,开发者应该设置 QGraphicsOpacityEffect 的属性(如透明度),然后将这个效果应用于一个图形项。Qt 的绘图系统会负责在适当的时候调用这个 draw 方法,以确保图形项以正确的透明度进行渲染。

  • 20
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值