Qt之阴影窗口

文章目录

  • 阴影窗口
  • 环境
  • 效果
  • 代码
    • ShadowWidget类
  • 使用

阴影窗口

阴影窗口基类QShadowWidget。通过基础QWidget,重载painteEvent来实现窗口阴影

环境

Qt5.6.2+VS2013

效果

Qt之阴影窗口_第1张图片

代码

ShadowWidget类

ShadowWidget.h

#pragma once

#include 

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;

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

ShadowWidget.cpp

#include "ShadowWindow.h"

#include 
#include 

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

使用

//继承
class Widget : public QShadowWidget

你可能感兴趣的:(Qt)