1
0
mirror of https://gitee.com/drabel/LibQQt.git synced 2025-01-04 10:18:44 +08:00
LibQQt/test/shadowwidget/testshadowwidget2.cpp

131 lines
4.0 KiB
C++
Raw Normal View History

2019-09-28 17:15:40 +08:00
#include <testshadowwidget2.h>
#include <QPainter>
#include <QtMath>
#include <qqtbodymover.h>
2019-09-28 17:15:40 +08:00
#include <qqtcore.h>
TestShadowWidget2::TestShadowWidget2 ( QWidget* parent ) : QWidget ( parent )
{
setWindowFlag ( Qt::FramelessWindowHint );
2019-09-28 17:15:40 +08:00
setAttribute ( Qt::WA_TranslucentBackground );
QQtBodyMover* mover = new QQtBodyMover ( this );
installEventFilter ( mover );
}
TestShadowWidget2::~TestShadowWidget2() {}
void TestShadowWidget2::paintEvent ( QPaintEvent* event )
{
2019-09-28 17:15:40 +08:00
//return QWidget::paintEvent ( event );
#if 0
QWidget* wgt = this;
QPainter painter ( wgt );
QColor color ( 217, 229, 246, 55 );
for ( int i = 0; i < 10; i++ )
{
QPainterPath path;
path.setFillRule ( Qt::OddEvenFill );
path.addRoundRect ( 10 - i, 10 - i,
wgt->width() - ( 10 - i ) * 2,
wgt->height() - ( 10 - i ) * 2,
4 );
color.setAlpha ( 255 - qSqrt ( i ) * 70 );
painter.setPen ( color );
painter.drawPath ( path );
}
#endif
#if 0
QPainterPath path;
path.setFillRule ( Qt::WindingFill );
path.addRect ( 10, 10, this->width() - 20, this->height() - 20 );
2019-09-28 17:15:40 +08:00
QPainter painter ( this );
painter.setRenderHint ( QPainter::Antialiasing, true );
painter.fillPath ( path, QBrush ( Qt::white ) );
QColor color ( 0, 0, 0, 50 );
for ( int i = 0; i < 10; i++ )
{
QPainterPath path;
path.setFillRule ( Qt::WindingFill );
path.addRect ( 10 - i, 10 - i, this->width() - ( 10 - i ) * 2, this->height() - ( 10 - i ) * 2 );
color.setAlpha ( 150 - qSqrt ( i ) * 50 );
painter.setPen ( color );
painter.drawPath ( path );
}
2019-09-28 17:15:40 +08:00
#endif
#if 1
//颜色样式解决了,
//还要解决位置从margin开始到10.
//如何让margin区域透明呢setMask
//不能从margin开始应该从frameGeometry开始。
//注意下painter的平移。painterpath是必须从0开始画。painter需要平移一定的距离。translate
//难点。
//高级绘图、视频播放、3D、动画
QPainter painter ( this );
//QPainterPath path;
//path.setFillRule ( Qt::WindingFill );
//path.addRoundRect ( 10, 10, this->width() - 20, this->height() - 20, 3 );
//painter.setRenderHint ( QPainter::Antialiasing, true );
//pline() << painter.background().color();
//painter.fillPath ( path, painter.background().color() );
//50这里没用
QColor color ( 0, 0, 0, 50 );
//40代表了横跨幅
int j = 40;
for ( int i = 0; i < j; i++ )
{
QPainterPath path;
path.setFillRule ( Qt::WindingFill );
//10就是margin。xxx
//画的圈子越来越大
path.addRoundRect ( j - i, j - i, this->width() - ( j - i ) * 2, this->height() - ( j - i ) * 2, 3 );
//颜色越来越浅。 初始数字越小,效果越好,越精细。
qreal alpha = 10 - ( qreal ) i * 1 / ( j / 30 ); //150 - qSqrt ( i ) * 50 ;
//无论如何不能过滤,都是细线。
//if ( ( ( int ) ( alpha / 10 ) % 2 ) == 1 )
// continue;
if ( alpha >= 0 )
{
color.setAlpha ( alpha );
pline() << alpha;
painter.setPen ( color );
painter.drawPath ( path );
}
}
//pline() << painter.compositionMode();
//painter.setCompositionMode ( QPainter::CompositionMode_Clear );
//painter.fillPath ( path, QBrush ( Qt::white ) );
QPainterPath p0;
p0.addRoundRect ( 40, 40, 80, 80, 3 );
p0.addRoundRect ( 50, 50, 50, 50, 3 );
//painter.save();
QPainter::CompositionMode m0 = painter.compositionMode();
painter.setCompositionMode ( QPainter::CompositionMode_Clear );
painter.fillPath ( p0, QBrush ( Qt::transparent ) );
painter.setCompositionMode ( m0 );
//painter.restore();
#endif
}