您现在的位置是:首页 > 技术文章网站首页技术文章

[Qt]窗体阴影实现

  • WangYe
  • 2020-11-25 18:15:42
  • 344 次阅读
简单实现窗体阴影部分,可移动;

效果:

图片.png


实现代码:

    创建类: ShadowWidget.h

#pragma once

#include <QWidget>
#include <QPainterPath>
#include <QPainter>
#include <qmath.h>
#include <QPoint> //坐标点
#include <QMouseEvent> //鼠标事件
#include <QBitmap>  //窗口绘制

class QShadowWidget : public QWidget
{
    Q_OBJECT
public:
    explicit QShadowWidget(QWidget* parent = Q_NULLPTR);
    ~QShadowWidget();

public:
    void setBorder(int border);
    int border() const;
    void setBGColor(QColor color);
    QColor bgColor() const;
    void setRatio(int ratio);
    int ratio() const;

    void mousePressEvent(QMouseEvent* e);//重写鼠标按下事件
    void mouseReleaseEvent(QMouseEvent*);//重写鼠标释放事件
    void mouseMoveEvent(QMouseEvent* e);//重写鼠标移动事件
    void enterEvent(QEvent*);  //重写鼠标进入事件
    void leaveEvent(QEvent*);  //重写鼠标离开事件

protected:
    void paintEvent(QPaintEvent* event);

private:
    void drawBG(QPainter* painter);

    void drawShadow(QPainter* painter);

private:
    QWidget* x_pMainWidget;
    int x_nBorder;
    QColor x_bgColor;
    int x_nRatio;

    QPoint m_beginPos;//用来记录鼠标的按下的开始位置
    bool m_press;//用来记录鼠标是否处于按下状态AA
};

创建类: ShadowWidget.cpp

#include "ShadowWidget.h"

QShadowWidget::QShadowWidget(QWidget* parent /*= Q_NULLPTR*/)
    :QWidget(parent)
{
    setWindowFlags(Qt::FramelessWindowHint);
    setAttribute(Qt::WA_TranslucentBackground);
    //setMouseTracking(true);

    x_nBorder = 5;
    x_bgColor = Qt::white;
    x_nRatio = 5;
}

QShadowWidget::~QShadowWidget()
{

}

void QShadowWidget::setBorder(int border)
{
    x_nBorder = border;

    update();
}

int QShadowWidget::border() const
{
    return x_nBorder;
}

void QShadowWidget::setBGColor(QColor color)
{
    x_bgColor = color;
}

QColor QShadowWidget::bgColor() const
{
    return x_bgColor;
}

void QShadowWidget::setRatio(int ratio)
{
    x_nRatio = ratio;
}

int QShadowWidget::ratio() const
{
    return x_nRatio;
}

void QShadowWidget::paintEvent(QPaintEvent* event)
{
    QPainter painter(this);

    painter.setRenderHint(QPainter::Antialiasing);

    drawBG(&painter);

    drawShadow(&painter);
}

void QShadowWidget::drawBG(QPainter* painter)
{
    painter->save();
    QBrush brush(x_bgColor);
    painter->setBrush(brush);
    painter->setPen(Qt::NoPen);

    QRect _rect = this->rect();
    QRect _rectBG = QRect(_rect.x() + x_nBorder, _rect.y() + x_nBorder, _rect.width() - 2 * x_nBorder, _rect.height() - 2 * x_nBorder);

    painter->drawRoundedRect(_rectBG, x_nRatio, x_nRatio);
    painter->restore();
}

void QShadowWidget::drawShadow(QPainter* painter)
{
    painter->save();

    QColor color(0, 0, 0, 50);

    for (int i = 0; i < x_nBorder; ++i)
    {
        QPainterPath path;
        path.setFillRule(Qt::WindingFill);

        path.addRoundedRect(x_nBorder - i, x_nBorder - i, this->width() - (x_nBorder - i) * 2, this->height() - (x_nBorder - i) * 2, x_nRatio, x_nRatio);

        color.setAlpha(150 - qSqrt(i) * 50);
        painter->setPen(color);
        painter->drawPath(path);
    }

    painter->restore();
}

void QShadowWidget::mousePressEvent(QMouseEvent* e)//鼠标按下事件
{
    if (e->button() == Qt::LeftButton)//鼠标左键按下
    {
        m_press = true;
        m_beginPos = e->pos();//鼠标相对窗体的位置
    }
}

void QShadowWidget::mouseReleaseEvent(QMouseEvent*)//鼠标释放事件
{
    m_press = false;
}


void QShadowWidget::mouseMoveEvent(QMouseEvent* e)       //--鼠标移动事件
{
    if (m_press)//鼠标是按下状态的
    {
        //当前鼠标相对窗体的位置-刚按下左键时的相对位置=鼠标移动的大小
        //鼠标移动的大小+窗体原来的位置=窗体移动后的位置
        this->move(e->pos() - m_beginPos + this->pos());
    }
}

void QShadowWidget::enterEvent(QEvent*)  //--鼠标进入窗体范围事件
{
    if (this->pos().y() <= 0)//鼠标进入并且已经上贴边
    {
        move(pos().x(), 0);//弹出整个窗体--x不变,y起始设为上边框
    }
}

void QShadowWidget::leaveEvent(QEvent*)  //鼠标离开窗体范围事件
{
    if (this->pos().y() <= 0)//窗体贴在屏幕上边
    {
        move(pos().x(), 1 - this->height());//贴边,其实就是只露出一点点,设置起始位置另窗体大部分不在可视区域
    }
}


使用方法:

/*继承*/
class Custom_control : public QShadowWidget    //.h

Custom_control::Custom_control(QWidget *parent)    //.cpp
    : QShadowWidget(parent)


文章评论 (0)



Top