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