QT 图形效果叠加

QT 图形效果叠加

Qt中可以给图元添加特效,QGraphicsEffect为特效基本类。

1:特效

QGraphicsBlurEffect //模糊效果
QGraphicsDropShadowEffect //阴影效果
QGraphicsColorizeEffect //使用色调的着色效果
QGraphicsOpacityEffect //透明效果

2:Demo

(1)main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    GraphicsView w;
    w.show();

    return a.exec();
}

(2)widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QGraphicsView>

class GraphicsView : public QGraphicsView
{
    Q_OBJECT

public:
    GraphicsView(QWidget *parent = 0);
    ~GraphicsView();
};

#endif // WIDGET_H

(3)widget.cpp

#include "widget.h"
#include <QPainter>
#include <QDialog>
#include <QPushButton>
#include <QHBoxLayout>
#include "graphicsscene.h"

GraphicsView::GraphicsView(QWidget *parent)
    : QGraphicsView(parent)
{
   this->resize(640,320);

   GraphicsScene* scene = new GraphicsScene(this);
   this->setScene(scene);
   this->setCacheMode(QGraphicsView::CacheBackground);
}



GraphicsView::~GraphicsView()
{

}

### (4)GraphicsScene.h

#ifndef GRAPHICSSCENE_H
#define GRAPHICSSCENE_H
#include <QGraphicsScene>
#include <QGraphicsBlurEffect>
#include <QGraphicsDropShadowEffect>
#include <QGraphicsColorizeEffect>
#include <QGraphicsOpacityEffect>

class GraphicsScene : public QGraphicsScene
{
    Q_OBJECT
public:
    GraphicsScene(QObject* parent = nullptr);
    ~GraphicsScene();
    void keyPressEvent(QKeyEvent *event);
    void printScene();
private:
    QGraphicsRectItem * _rect;
    QGraphicsEllipseItem * _ellpise;
    QGraphicsBlurEffect* _blur;
    QGraphicsDropShadowEffect* _shadow;
    QGraphicsColorizeEffect* _colorize;
    QGraphicsOpacityEffect* _opacity;

private slots:
    void setRadius();
    void setOpacity();
};

#endif // GRAPHICSSCENE_H

### (5)GraphicsScene.cpp

#include "graphicsscene.h"
#include <QDebug>
#include <QGraphicsPixmapItem>
#include <QGraphicsSceneMouseEvent>
#include <QPainter>

#include <QTimer>

GraphicsScene::GraphicsScene(QObject* parent):QGraphicsScene(parent)
{

    QGraphicsPixmapItem* pixmapItem = this->addPixmap(QPixmap("E:/pic/night.png"));
    pixmapItem->setFlag(QGraphicsItem::ItemIsMovable);

    //添加透明效果:可以作为图片的淡入淡出
    _opacity = new QGraphicsOpacityEffect(this);
    _opacity->setOpacity(0.0);

    //着色效果
    _colorize = new QGraphicsColorizeEffect(this);
    _colorize->setColor(QColor(Qt::red));

    //添加阴影特效
    _shadow = new QGraphicsDropShadowEffect(this);
    _shadow->setBlurRadius(10);
    _shadow->setColor((Qt::blue));
    _shadow->setXOffset(50);
    _shadow->setYOffset(50);

    //添加模糊特效
    _blur = new QGraphicsBlurEffect(this);
//    blur->setBlurRadius(1);    //设置模糊半径

    pixmapItem->setGraphicsEffect(_opacity);  //添加效果




    //定时器
    QTimer* timer = new QTimer(this);
//    connect(timer, SIGNAL(timeout()),SLOT(setRadius()));
    connect(timer, SIGNAL(timeout()),SLOT(setOpacity()));
    timer->start(50);
}

void GraphicsScene::setRadius() {
    static int radius = 0.0;
    static bool isAdded = true;
    if(isAdded) {
        ++radius;
        if(radius == 10)
            isAdded = false;
    }
    else {
        --radius;
        if(radius ==0)
            isAdded = true;
    }
    _blur->setBlurRadius(radius);
    qDebug()<<"timeout"<<endl;
}

void GraphicsScene::setOpacity() {
    static double opacity = 0.0;
    static bool isAdded = true;
    if(isAdded) {
        opacity += 0.1;
        if(opacity < 1.000001 && opacity >0.999999)
            isAdded = false;
    }
    else {
        opacity -=0.1;
        if(opacity < 0.000001 && opacity >-0.000001)
            isAdded = true;
    }
    _opacity->setOpacity(opacity);
    qDebug()<<"timeout"<<endl;
}

void GraphicsScene::printScene() {
    QPixmap pixmap(this->itemsBoundingRect().size().toSize());
    QPainter painter;
    painter.begin(&pixmap);
    this->render(&painter);
    painter.end();
    pixmap.save("E:/pic/scene.png");
}

void GraphicsScene::keyPressEvent(QKeyEvent *event){

    printScene();
    QGraphicsScene::keyPressEvent(event);
}

GraphicsScene::~GraphicsScene() {
    qDebug()<<__FUNCTION__<<endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值