Qt——功能:给窗口增加影子

测试环境:win10、Qt Creator 4.11.1、5.14.2版本SDK

 

1、平时使用软件时,经常看到弹出的窗口就像有了影子:设置窗口周围有一圈浅浅的灰色,就像窗口的投影。

       

 

2、那么Qt中如何实现这种效果?

QGraphicsDropShadowEffect可以给QWidget的类增加投影效果,实际效果类似上图。

3、话不多说,上代码

WidgetDropShadow.h
#ifndef WIDGET_DROP_SHADOW_H
#define WIDGET_DROP_SHADOW_H

#include <QWidget>
#include <QFrame>
#include <QGraphicsDropShadowEffect>
#include <QVBoxLayout>

class WidgetDropShadow : public QWidget
{
    Q_OBJECT
public:
    explicit WidgetDropShadow(QWidget *parent = nullptr);
    ~WidgetDropShadow();

protected:
    void paintEvent(QPaintEvent *event) override;

private:
    QFrame* m_shadowFrame;
    QVBoxLayout* m_frameLayout;
    QGraphicsDropShadowEffect* m_shadowEffect;

private:
    void initWidget();
};

#endif // WIDGET_DROP_SHADOW_H


//
WidgetDropShadow.c
#include "WidgetDropShadow.h"
#include <QHBoxLayout>
#include <QPainter>
#include <QStyleOption>

WidgetDropShadow::WidgetDropShadow(QWidget *parent) : QWidget(parent),
    m_shadowEffect(nullptr)
{
    initWidget();
}

WidgetDropShadow::~WidgetDropShadow()
{

}

void WidgetDropShadow::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)

    QStyleOption opt;
    opt.initFrom(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}

void WidgetDropShadow::initWidget()
{
    setWindowFlags(Qt::FramelessWindowHint);

    m_shadowFrame = new QFrame();
    m_shadowFrame->setObjectName("shadowFrame");

    m_frameLayout = new QVBoxLayout();
    m_frameLayout->setContentsMargins(0,0,0,0);
    m_frameLayout->setSpacing(0);
    m_shadowFrame->setLayout(m_frameLayout);

    m_shadowEffect = new QGraphicsDropShadowEffect(this);
    m_shadowEffect->setBlurRadius(40);  //以像素为单位设置阴影
    m_shadowFrame->setStyleSheet("QFrame#shadowFrame{background:rgb(0,0,255);border-radius:8px;border:none;}");
    m_shadowEffect->setOffset(0, 0);    //设置阴影偏移方向
    m_shadowEffect->setColor(QColor(255,0,0));  //设置阴影颜色
    m_shadowFrame->setGraphicsEffect(m_shadowEffect);

    QHBoxLayout* layout = new QHBoxLayout();
    layout->setContentsMargins(18,18,18,18);
    layout->setSpacing(0);
    layout->addWidget(m_shadowFrame);

    setLayout(layout);
    setStyleSheet("background:rgb(255,255,255);border-radius:8px;border:1px solid rgb(230,230,230);");

    resize(600, 400);
}

运行效果:

 

修改参数:调整影子偏移方向:

m_shadowEffect->setOffset(0, 10);    //设置阴影偏移方向

效果如下:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值