代码:

#ifndef SHADOW_WIDGET_H
#define SHADOW_WIDGET_H#include <QWidget>class Shadow_Widget : public QWidget
{Q_OBJECTpublic:Shadow_Widget(QWidget *parent = nullptr);~Shadow_Widget();void setCenterWidgetLayout(QLayout * layout);protected:void mouseMoveEvent(QMouseEvent *event)override;void mousePressEvent(QMouseEvent *event)override;void mouseReleaseEvent(QMouseEvent *event)override;private:void setLayout(QLayout * layout);void updatePaddingRect();QWidget * widget;enum class pressType{NoPressed,                 //未按下PressedRight,              //鼠标按下右侧PressedBottom,             //鼠标按下下侧PressedRightBottom,        //鼠标按下右下侧PressedButNotInPadding     //按下但没在右、下、右下边缘};pressType mousePressType{pressType::NoPressed};int padding;                    //边距bool moveEnable = true;         //可移动bool resizeEnable = true;        //可拉伸int rectX, rectY, rectW, rectH; //窗体坐标+宽高QPoint lastPos;QRect rectRight;QRect rectBottom;QRect rectRightBottom;
};
#endif // SHADOW_WIDGET_H
#include "shadow_widget.h"
#include <QVBoxLayout>
#include <QGraphicsDropShadowEffect>
#include <QEvent>
#include <QMouseEvent>Shadow_Widget::Shadow_Widget(QWidget *parent): QWidget(parent)
{padding = 15;moveEnable = true;resizeEnable = true;widget = new QWidget;widget->setObjectName("centerWidget");widget->setStyleSheet("QWidget#centerWidget{background-color:#FFFFFF;border-radius:15px;}");QVBoxLayout *lay_bg = new QVBoxLayout;lay_bg->addWidget(widget);setAttribute(Qt::WA_TranslucentBackground, true);setWindowFlags(this->windowFlags() | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(this);shadow->setOffset(0, 0);shadow->setColor(QColor("#444444"));shadow->setBlurRadius(padding);widget->setGraphicsEffect(shadow);lay_bg->setContentsMargins(padding,padding,padding,padding);setLayout(lay_bg);setMouseTracking(true);widget->setMouseTracking(true);
}Shadow_Widget::~Shadow_Widget()
{
}void Shadow_Widget::mouseMoveEvent(QMouseEvent *event)
{QPoint point = event->pos();if (resizeEnable){updatePaddingRect();if (rectRight.contains(point)){setCursor(Qt::SizeHorCursor);}else if (rectBottom.contains(point)){setCursor(Qt::SizeVerCursor);}else if (rectRightBottom.contains(point)){setCursor(Qt::SizeFDiagCursor);}else{setCursor(Qt::ArrowCursor);}}//根据当前鼠标位置,计算XY轴移动了多少int offsetX = point.x() - lastPos.x();int offsetY = point.y() - lastPos.y();//根据按下处的位置判断是否是移动控件还是拉伸控件if (moveEnable){if (mousePressType == pressType::PressedButNotInPadding){move(x() + offsetX, y() + offsetY);}}if (resizeEnable){if (mousePressType == pressType::PressedRight){setGeometry(rectX, rectY, rectW + offsetX, rectH);}else if (mousePressType == pressType::PressedBottom){setGeometry(rectX, rectY, rectW, rectH + offsetY);}else if (mousePressType == pressType::PressedRightBottom){int resizeW = rectW + offsetX;int resizeH = rectH + offsetY;setGeometry(x(), y(), resizeW, resizeH);}else{}updatePaddingRect();}QWidget::mouseMoveEvent(event);
}void Shadow_Widget::mousePressEvent(QMouseEvent *event)
{rectX = x();rectY = y();rectW = width();rectH = height();lastPos = event->pos();if (rectRight.contains(lastPos)){mousePressType = pressType::PressedRight;}else if (rectBottom.contains(lastPos)){mousePressType = pressType::PressedBottom;}else if (rectRightBottom.contains(lastPos)){mousePressType = pressType::PressedRightBottom;}else{mousePressType = pressType::PressedButNotInPadding;}QWidget::mousePressEvent(event);
}void Shadow_Widget::mouseReleaseEvent(QMouseEvent *event)
{mousePressType = pressType::NoPressed;setCursor(Qt::ArrowCursor);updatePaddingRect();QWidget::mouseReleaseEvent(event);
}void Shadow_Widget::setLayout(QLayout *layout)
{QWidget::setLayout(layout);
}void Shadow_Widget::setCenterWidgetLayout(QLayout *layout)
{if(widget->layout())return;int left{0},top{0},right{0},bottom{0};layout->getContentsMargins(&left, &top, &right, &bottom);layout->setContentsMargins(std::max(left,padding),std::max(top,padding),std::max(right,padding),std::max(bottom,padding));widget->setLayout(layout);
}void Shadow_Widget::updatePaddingRect()
{int width = this->width();int height = this->height();int padding = 20;rectRight = QRect(width - padding, padding, padding, height - padding * 2);rectBottom = QRect(padding, height - padding, width - padding * 2, padding);rectRightBottom = QRect(width - padding, height - padding, padding, padding);
}

使用:

#include "shadow_widget.h"
#include <QApplication>
#include <QGridLayout>
#include <QPushButton>int main(int argc, char *argv[])
{QApplication a(argc, argv);QGridLayout * gl = new QGridLayout;for(int i = 0;i< 5;++i){for(int j = 0;j < 5;++j){gl->addWidget(new QPushButton("测试"),i,j);}}Shadow_Widget w;w.setCenterWidgetLayout(gl);w.show();w.resize(600,600);return a.exec();
}

Qt编写自定义控件:带阴影、圆角、可拉伸的弹窗相关推荐

  1. Qt编写自定义控件4-旋转仪表盘

    前言 旋转仪表盘,一般用在需要触摸调节设置值的场景中,其实Qt本身就提供了QDial控件具有类似的功能,本控件最大的难点不在于绘制刻度和指针等,而在于自动计算当前用户按下处的坐标转换为当前值,这个功能 ...

  2. Qt编写自定义控件44-天气仪表盘

    一.前言 天气仪表盘控件是所有控件中唯一一个使用了svg矢量图的控件,各种天气图标采用的矢量图,颜色变换采用动态载入svg的内容更改生成的,其实也可以采用图形字体来做,本次控件为了熟悉下svg在Qt中 ...

  3. Qt编写自定义控件29-颜色选取面板

    一.前言 这个控件主要是模仿QColorDialog对话框中的颜色选取面板,提供一个十字形状的标识器,鼠标按下开始选取颜色,移动到哪就选择该处的颜色值,对应右侧颜色条放大显示,本控件的难点就是如何绘制 ...

  4. Qt编写自定义控件3-速度仪表盘

    前言 速度仪表盘,写作之初的本意是用来展示当前测试的网速用的,三色圆环+数码管显示当前速度,Qt自带了数码管控件QLCDNumber,直接集成即可,同时还带有动画功能,其实也可以用在汽车+工业领域等, ...

  5. Qt编写自定义控件14-环形进度条

    前言 环形进度条,用来展示当前进度,为了满足大屏UI的需要特意定制,以前有个叫圆环进度条,不能满足项目需要,只能重新定做,以前的进度间距不能自适应分辨率,而且当前进度对应的反的进度不能单独设置颜色,即 ...

  6. Qt编写自定义控件35-GIF录屏控件

    一.前言 在平时的写作过程中,经常需要将一些操作动作和效果图截图成gif格式,使得涵盖的信息更全面更生动,有时候可以将整个操作过程和运行效果录制成MP4,但是文件体积比较大,而且很多网站不便于上传,基 ...

  7. Qt编写自定义控件及插件的使用

    在使用Qt Designer设计窗体界面时,我们可以使用Widget Box里的窗体控件非常方便的绘制界面,比如拖进去一个按钮,一个文本编辑器等.虽然Qt Designer里的控件可以满足我们大部分的 ...

  8. Qt编写自定义控件:彩色渐变圆角按钮之二

    代码: #ifndef COLORGRADIENTROUNDEDBUTTON_H #define COLORGRADIENTROUNDEDBUTTON_H#include <QAbstractB ...

  9. Qt编写自定义控件插件路过的坑及注意事项

    在一日一控件的口号下,终于写好了五十几个自定义控件,包括各种仪表盘,各种温度计,各种进度条,各种按钮等,具体可参见(http://www.cnblogs.com/feiyangqingyun/p/61 ...

最新文章

  1. python模块-random
  2. HTML课堂笔记02-21
  3. eve模拟器华为镜像_EVE-NG简单入门介绍
  4. 蓝桥杯单片机基础学习00_2
  5. mac php 超时,PHP---Mac上开启php错误提示
  6. c# reverse_清单 .Reverse()方法,以C#为例
  7. 使用SourceTree
  8. 【20171108晚】BeEF 局域网中的一次实战演练(三)
  9. centos php 显示错误提示,Centos下编译php的典型错误及解决
  10. deepin8、9安装docker并添加用户,解决报错:aptsources.distro.NoDistroTemplateException
  11. 中国计算机游戏竞赛,信任与欺骗的游戏:全球计算机游戏程序竞赛,诠释了《老子通释》...
  12. 浏览器同步测试神器 — BrowserSync
  13. 电线直径对照表_电线平方与功率对照表
  14. 【idea打包jar包+运行jar包】亲测详解
  15. 喜欢是可以培养的,学习也是
  16. Flex和Flash一起使用开发项目各取所长
  17. 消息队列如何保证消息的幂等性
  18. 基于Java(Jsp+servelet+Javabean)+MySQL实现图书管理系统【100010229】
  19. 期末作业C#实现学生宿舍管理系统
  20. git时出现! [rejected] master -> master (non-fast-forward)解决方法

热门文章

  1. 影响利率风险结构的因素_利率风险结构是什么意思 影响利率的因素
  2. java 创建word文件_java基于feemarker 生成word文档(超级简单)
  3. MFC中CDC *PDC hDC 等等及Wnd的区别
  4. python代码手机壁纸_Python制作微信好友背景墙教程(附完整代码)
  5. 蓝桥杯—手机尾号评分—Java
  6. HDU 1698 Just a Hook(线段树区间更新)
  7. 命名空间提示“http://schemas.microsoft.com/xaml/behaviors”不存在Interation的解决办法
  8. 如何手机桌面加计算机,教你自制手机、电脑壁纸|手机一键加字、加光晕特效,4步搞定!...
  9. 基于Arduino的超声波悬浮
  10. 区块链数字货币应用场景不同决定了价值空间