设置QT窗体的阴影效果

1. 新创建一个QWidget为基类的ShadowEffect窗体项目:

2. 设置底板的垂直布局lay_bg,并设置margin为24;

3. 新建一个QWidget在它上面,命名为widget_bg,设置背景色等.

ShadowEffect.cpp

#include <QGraphicsDropShadowEffect>

shadowEffect::shadowEffect(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::shadowEffect)
{
    ui->setupUi(this);
    //设置窗体透明
    this->setAttribute(Qt::WA_TranslucentBackground, true);
    //设置无边框
    this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
    //实例阴影shadow
    QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(this);
    //设置阴影距离
    shadow->setOffset(0, 0);
    //设置阴影颜色
    shadow->setColor(QColor("#444444"));
    //设置阴影圆角
    shadow->setBlurRadius(30);
    //给嵌套QWidget设置阴影
    ui->widget_bg->setGraphicsEffect(shadow);
    //给垂直布局器设置边距(此步很重要, 设置宽度为阴影的宽度)
    ui->lay_bg->setContentsMargins(24,24,24,24);
}

大致效果如下:

 

 

 注意,当需要全屏的时候,可以设置margin为0.

具体进一步改善阴影效果,了解下QGraphicsDropShadowEffect类。

 此后,还需控制标题栏的拖拽移动:

void shadowEffect::mousePressEvent(QMouseEvent *e)
{
    if( e->button() != Qt::LeftButton) return;
    QRect r = this->ui->frameTitle->frameGeometry();
    QRect globalRect(ui->frameTitle->mapToGlobal( r.topLeft() ), r.size() );
    last = e->globalPosition().toPoint();
    leftBtnClicked = true;    //只有按下和释放两端的e->button()值为Qt::LeftButton,中间拖曳过程是Qt::NoButton。所以这里需存储标记
    dragAvailable = globalRect.contains(last);
}

void shadowEffect::mouseMoveEvent(QMouseEvent *e)
{
    if(leftBtnClicked && dragAvailable) {
        this->move(this->pos() + e->globalPosition().toPoint() - last);
        last = e->globalPosition().toPoint();
    }
}

void shadowEffect::mouseReleaseEvent(QMouseEvent *e)
{
    if(e->button() == Qt::LeftButton && dragAvailable) {
        this->move(this->pos() + e->globalPosition().toPoint() - last);
        dragAvailable = false;
        leftBtnClicked = false;
    }
}

 

参考了:https://blog.csdn.net/tonny7501/article/details/81748294

 

posted @ 2022-05-02 21:44  云山漫卷  阅读(1857)  评论(0编辑  收藏  举报