您现在的位置是:首页 > 技术文章网站首页技术文章
[Qt]窗体阴影实现
简单实现窗体阴影部分,可移动;
效果:
实现代码:
创建类: 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)
上一篇:[Qt]自定义图标按钮02
相关文章
文章评论 (0)