Qt 中实现阴影窗口

2023-11-05

阴影窗口的实现方法一般有三种,

方法一是:在窗口的构造函数中设置窗口的属性为:

setAttribute(Qt::WA_TranslucentBackground);

从而保证窗口不被绘制的部分透明化。接着重写绘制函数paintEvent(),

其代码示例如下:

void QT_Test::paintEvent(QPaintEvent *event)

{

QPainterPath path;

path.setFillRule(Qt::WindingFill);

path.addRect(10, 10,
this->width()-20,this->height()-20);

QPainter
painter(this);

painter.setRenderHint(QPainter::Antialiasing, true);

painter.fillPath(path, QBrush(Qt::white));

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

for(int i=0; i<10;
i++)

{

QPainterPath path;

path.setFillRule(Qt::WindingFill);

path.addRect(10-i,10-i,
this->width()-(10-i)*2, this->height()-(10-i)*2);

color.setAlpha(150

  • qSqrt(i)*50);

painter.setPen(color);

painter.drawPath(path);

}

}

方法二:用代用阴影的背景图片实现

QT的窗口对于一般的窗口程序来说,已经完全够用了。但有时候我们要求界面比较精美,或者还想自定义皮肤之类的话,就需要自己定义窗口。这里介绍一种简单的自定义窗口的方法。

自定义样式可以达到很多的自定义皮肤的效果,但自定义样式有时不能指定窗口的形状,或者实现窗口的阴影效果(使用QT的QGraphicsEffect定义阴影,但运行效率较低)。这样的话可以重载窗口的paintEvent函数实现自绘制窗口。

先准备一张有窗口阴影的背景图,然后在paintEvent函数里面使用QPainterx绘制这张图。

这里将窗口类命名为GraphicDialog

示例代码如下:

class GraphicDialog :

public QDialog

{

public:

GraphicDialog(QWidget*parent=NULL,Qt::WindowFlags

f = 0/* Qt::FramelessWindowHint*/);

~GraphicDialog(void);

protected:

void paintEvent(QPaintEvent *);

QPixmap background;

};

在窗口类构造函数中:

setWindowFlags(Qt::FramelessWindowHint); //无标题窗口

setAttribute(Qt::WA_TranslucentBackground);

background.load(":/Images/DialogBackground");

在paintEvent中

QPainter p(this);

p.drawPixmap(0, 0, rect().width(), rect().height(),
background);

方法三是通过QFrame + QGraphicsDropShadowEffect的方式实现。

其代码示例如下:

QFrame *frame = new QFrame(this);

frame->setStyleSheet("QFrame{background-color: rgb(255,
255, 255);

border-radius:10px}");

//设置圆角与背景透明

frame->setGeometry(5, 5, this->width() - 5,
this->height() - 5);//设置有效范围框

QGraphicsDropShadowEffect *shadow_effect = new
QGraphicsDropShadowEffect(this);

shadow_effect->setOffset(0, 0);

shadow_effect->setColor(Qt::black);

shadow_effect->setBlurRadius(10);

frame->setGraphicsEffect(shadow_effect);

this->setAttribute(Qt::WA_TranslucentBackground);

//若没有效果,可能是设置了setContentsMargins,调整这个函数的参数即可

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 中实现阴影窗口 的相关文章

  • 如何通过 Qt 创建网络服务 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Qt 5.5 QOpenGLWidget 链接错误未链接任何 openGL 调用

    我尝试使用 Qt 5 5 1 构建一个简单的 OpenGL 应用程序 一切都很好 直到我尝试使用 glClearColor 等 openGL 本机函数调用 该小部件实际上编译并产生黑屏 但在我尝试使用任何 openGL 本机函数后 它甚至不
  • 第一个随机数始终小于其余随机数

    我碰巧注意到 在 C 中 使用 std rand 方法调用的第一个随机数大多数时候都明显小于第二个随机数 关于 Qt 实现 第一个几乎总是小几个数量级 qsrand QTime currentTime msec qDebug lt lt q
  • 在 Qt 5 中嵌入 Python

    我想将 Python 解释器嵌入到 Qt 5 应用程序中 我在 Qt 5 中有一个工作应用程序 但是当我把 include
  • SWI-Prolog 与 C++ 接口的问题

    我试图让 SWI Prolog 与 C 很好地配合 现在束手无策 现在 在我开始准确解释我的问题是什么之前 我想首先说明我的项目是关于什么的以及我选择了哪些工具来开发解决方案 我的教授分配给我的任务是开发一个 GUI 程序 作为 SWI p
  • QML:无法读取未定义的属性“xxx”

    ApplicationWindow id root property string rootName rootName visible true width 800 height 400 title qsTr WatchFace Maker
  • 如何在 Qt Creator 中编辑 QtWebKit 的右键上下文菜单?

    好吧 这是我的困境 我正在使用 Qt Creator 制作一个使用 Webkit 的简单应用程序 我认为 Qt Creator 会有一种简单的方法来使用信号和槽编辑器编辑右键单击上下文菜单 但事实证明这不是真的 我知道 webkit 有与上
  • 获取 QListView 中所有可见项目的简单方法

    我正在尝试使用 Qt Framework 开发一个图像库应用程序 应用程序从所选文件夹加载所有图像 并使用 QListView 控件显示这些图像 但现在我想通过仅加载用户可见的图像来减少内存消耗 由于没有直接函数来获取视图中的所有可见项目
  • Qt 为什么使用 QString::number() 而不是 QLocale().toString()?

    我正在开发的应用程序将在许多国家推出 并且需要支持他们的语言 我一直在回顾我的代码并替换以下每个实例 QString number and QString toDouble with QLocale toString and QLocale
  • 完全彻底卸载QT Creator

    问题 如何从 Linux 机器上卸载 QT Creator 我的 Debian Jessie 机器上的安装已损坏 我尝试过重新安装 修复等 但没有成功 建议我完全卸载 获取最新版本并重新安装 问题是我不确定如何执行此操作 每次我尝试时 QT
  • 如何声明一个带有成员函数指针的函数

    我有一个类 其中的成员变量指向库对象 class myClassA private libraryClass libraryObject 该库类发出事件 以字符串为特征 并提供一种机制 允许客户端类指定在发出事件时应调用的成员函数 因此在m
  • 使用 OpenGL 渲染 QImage

    与我相关的其他问题 https stackoverflow com questions 20126354 render qimage from sooffscreenrenderer in qglwidget 我认为更核心的问题是 如何渲染
  • 将 jstring 转换为 QString

    我正在调用一个返回字符串的 Java 函数 QAndroidJniObject obj QAndroidJniObject callStaticObjectMethod
  • 在 Qt 中使用多个不同的流读取同一文件

    使用 Qt 是否可以使用多个流读取文件以同时访问其中的不同数据部分 请注意 Qt 中的流 QTextStream QDataStream 不处理底层设备中的位置 流类只是一个包装器 用于更轻松地解析设备 QFile 实例 内的二进制数据 因
  • Qt中Q_PROPERTY的意义是什么?

    我无法理解 Q PROPERTY 的用法 Q PROPERTY 如何帮助程序具有防御性 它是干什么用的 我看过这个论坛 但确实无法应用 我已经理解了这个例子 但不明白它的用法 这是一个例子 我能从中得到什么 我知道阅读将赋予只读特权 wri
  • Qt中用于线程间通信的类设计

    问题陈述 用相机跟踪物体并相应地移动相机的方位角和仰角 Process 相机获取物体的图像 处理相机的每一帧以查找物体 应该被跟踪 并将每帧中生成的信息传递给机械设备 万向节 以平移和倾斜方式移动摄像机 Design 主 Gui 在一个线程
  • 如何将自定义 Qt 类型与 QML 信号一起使用?

    我在 Qt 5 2 qml 应用程序中创建了一个自定义类型 class Setting public QObject Q OBJECT Q PROPERTY QString key READ key WRITE setKey Q PROPE
  • 了解 Qt3D 创建的网格

    我创建了一个 Qt3D 网格 如下所示 Qt3DCore QEntity newEntity new Qt3DCore QEntity Qt3DExtras QConeMesh mesh new Qt3DExtras QConeMesh m
  • Qt QML 数据模型似乎不适用于 C++

    我一直在使用中的示例http doc qt digia com 4 7 qdeclarativemodels html http doc qt digia com 4 7 qdeclarativemodels html这是 QML 声明性数
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap

随机推荐

  • echarts设置y轴值间隔

    在标签yAxis 中 设置min max splitNumber 例如 min 0 max 1 splitNumber 10 呈现
  • 暴力破解漏洞

    0x01 漏洞描述 暴力破解漏洞 暴力破解的产生是由于服务器端没有做合理的限制 导致攻击者可以通过暴力的手段破解所需信息 如用户名 密码 验证码等 暴力破解的关键在于字典的大小 暴力破解需要一个庞大的字典 如4位数字的验证码 那么暴力破解的
  • MDK软件不能模拟仿真STM32F407的问题解决方法

    以下转载文章有点多 如有侵权请联系我删除哦 https blog csdn net weixin 49093913 article details 125362111 关于Keil MDK 5 仿真STM32F4报错no read perm
  • extjs html 指向网页,extjs-mvc结构实践(二):基本页面

    接着来 上一篇搭建了基本的项目骨架 到最后 其实啥也没看见 书接上回 开始写UI效果 目标 全屏显示 左侧导航菜单 右侧标签页切换操作内容区域 包含header和footer 导航菜单动态ajax产生 点击对应菜单可以动态加载js资源或者数
  • 基于小程序+SpringBoot制作一个音乐播放器

    此文主要实现在小程序内音乐播放功能 使用Java作为后端语言进行支持 界面友好 开发简单 一 小程序 1 1 项目创建 1 2 首页 轮播图 热门歌曲 iconfont图标引入 1 3 热门歌单 歌单首页 歌单详情 歌曲详情 1 4 个人中
  • 一些会导致Bundle安装失败的原因

    Bundle RequiredExecutionEnvironment中的值和可用的执行环境不符 缺少Bundle SymbolicName 重复的导入同一个package 导出或导入java 导出的package中必须的属性未定义 安装一
  • 几种前端h264播放器记录

    近期做了点工作记录一下 主要是将H264流在html5上进行播放 众所周知 大多数的 video组件都是支持FLV或者MP4以及m3u8格式的 而如果是WebRTC是直接集成好了 本次要求的环境主要是通过Websocket方式进行流传输 不
  • pandas 生成excel 和 csv

    import pandas as pd a a b c b 1 2 3 dit char a num b file path r output xlsx writer pd ExcelWriter file path df pd DataF
  • leaflet常用插件库

    1 常用地图切换加载 osm google baidu gaode tianditu etc https github com htoooth Leaflet ChineseTmsProviders 2 切片地图加载 wmts 支持矢量切片
  • 如何获取节点的方法,动态计算节点高度

    监听节点偏移量 onScroll e const scrollTop e detail 根据组件的高度 计算当前的区间在哪个位置 this data scrollIntoview this data activeKey this getAc
  • 冒泡排序和快速排序的分析与比较

    冒泡排序 就是相邻的两个元素相互比较并根据比较结果决定是否交换位置 如从小到大排序 相邻两个元素两两比较 将值更大的元素交换到右侧 如此到最后一个元素 就能确定最大的一个值 一轮排序结束 若某一轮排序交换位置的次数为0 则排序结束 冒泡排序
  • GC0063-51单片机手持可充电VL53L01激光测距离测量报警倒车雷达防撞报警视力保护

    实践制作DIY GC0063 51单片机手持激光测距离测量 一 功能说明 基于51单片机设计 51单片机手持激光测距离测量 二 功能介绍 STC89C52单片机 lcd1602 VL53L01激光测距 锂电池充电电路 18650锂电池 继电
  • 基于时序数据处理的分布式光伏功率预测系统

    摘要 目的 使用高质量的历史数据预测未来光伏发电功率 对高效利用太阳能可再生能源 补充电网供电能力和推进节能减碳具有重要意义 方法 由于光伏时序数据质量参差不齐 本文提出了面向光伏时序数据的缺失值与异常值处理算法 并基于此搭建了分布式光伏功
  • 医学自然语言处理(NLP)相关论文汇总之 EMNLP 2021

    医学自然语言处理 NLP 相关论文汇总之 EMNLP 2021 写在前面 EMNLP2021前段时间已经放榜 一直没时间整理 最近抽时间整理了一下该会议在医疗自然语言处理方向上的相关论文 放在这里 希望对大家有一定的帮助吧 还会继续更新 大
  • Unity3D获得Android和iOS设备的唯一标识

    前言 android为mac地址 ios为advertisingIdentifier 函数都比较简单 网上也搜得到 我也就不多说了 主要是对于我们没做过安卓和IOS开发的人来说 整合进工程有各种的问题 我也就直接上网盘了点击打开链接 代码包
  • 【ant design vue】图片上传(一)

    官网是这样的 action 官网说不管是否使用都不能空着 但是实际上 在我的项目中是没有使用到的 我们是动态上传到后端 然后后端返回一个图片地址给我们显示在前台 代码如下 accept 是限制图片上传类型 customRequest 是自定
  • android edittext 数字正则,一个带有正则匹配的EditText

    先上效果 说明 图中的EditText能够在失去焦点后验证输入框中的文本是否与正则表达式匹配 这里我设置的是5位整数 d 5 当输入110时 不匹配 边框变红并抖动 文本清除 gif中白色文本是因为录制的问题 实际文本已清除 输入12306
  • windows10 powershell窗口输出卡住(看这篇就够了)

    问题原因 cmd窗口开启了快速编辑模式 当点击窗口时运行的进程会被暂停直至点击回车按钮 解决方案 取消勾选快速编辑模式 1 第一步 右键标题栏 选择 属性 第二步 选择 编辑选项 区域 取消 快速编辑模式 的选项 如图所示
  • Linux安装mysql5.7.26 --(傻瓜版3分钟搞定)

    前言 在这之前的一天时间里 我全网搜mysql 的各种安装方式 还有版本不同带来的问题 会发现在 Mac 或者 在linux上安装5 7 一下版本时 出现的问题会少很多 尤其是 拿着 dmg文件在Mac 安装 就是1分钟的事 但是在linu
  • Qt 中实现阴影窗口

    阴影窗口的实现方法一般有三种 方法一是 在窗口的构造函数中设置窗口的属性为 setAttribute Qt WA TranslucentBackground 从而保证窗口不被绘制的部分透明化 接着重写绘制函数paintEvent 其代码示例