Qt 窗口阴影边框

环境:Qt 5.15 + VS2019

方法一:QGraphicsDropShadowEffect

实现方法参考链接:https://blog.csdn.net/goforwardtostep/article/details/99549750
使用此方法添加窗口阴影,会出现警告信息:
在这里插入图片描述
且窗口最大化与还原切换时会出现子控件刷新问题:
在这里插入图片描述

方法二:九宫格贴图

实现方法参考链接:https://blog.csdn.net/goforwardtostep/article/details/99549750
需要美工

方法三:paintEvent

实现方法参考链接:https://blog.csdn.net/goforwardtostep/article/details/99549750
此方法绘制圆角边框不够完美
下图右边为paintEvent使用addRoundedRect实现,左边为结合九宫格思想通过paintEvent实现
在这里插入图片描述
下面为上图右侧实现代码:
app_window.h

#ifndef APP_WINDOW_H
#define APP_WINDOW_H#include <QWidget>namespace Ui {
class AppWindow;
}class AppWindow : public QWidget
{Q_OBJECTpublic:explicit AppWindow(QWidget *parent = nullptr);~AppWindow();protected:void paintEvent(QPaintEvent* event) override;private:Ui::AppWindow *ui;//阴影宽度int shadowWidth_ = 15;//窗口圆角int windowRadius_ = 9;
};#endif // APP_WINDOW_H

app_window.cpp

#include "app_window.h"
#include "ui_app_window.h"
#include <QPainter>
#include <QPainterPath>AppWindow::AppWindow(QWidget *parent): QWidget(parent), ui(new Ui::AppWindow)
{ui->setupUi(this);setAttribute(Qt::WA_TranslucentBackground); // 背景透明setWindowFlags(Qt::Window | Qt::FramelessWindowHint);QString qss = QString("background-color: rgb(255, 255, 255); border-radius:%1px").arg(windowRadius_);ui->widgetMain->setStyleSheet(qss);ui->gridLayout->setMargin(shadowWidth_);
}AppWindow::~AppWindow()
{delete ui;
}void AppWindow::paintEvent(QPaintEvent *event)
{int radius = shadowWidth_ + windowRadius_;int width = this->width();int height = this->height();QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing, true); //抗锯齿painter.setPen(Qt::NoPen);//线性渐变QLinearGradient linearGradient;linearGradient.setColorAt(0,QColor(255,0,0, 250));linearGradient.setColorAt(1,QColor(255,0,0, 50));//圆形渐变QRadialGradient radialGradient;radialGradient.setColorAt(0,QColor(255,0,0, 250));radialGradient.setColorAt(1,QColor(255,0,0, 50));//左上角radialGradient.setCenter(radius, radius); //中心点radialGradient.setRadius(radius); //半径radialGradient.setFocalPoint(radius, radius); //焦点painter.setBrush(radialGradient);QRectF rectf(0, 0, radius*2, radius*2);QPainterPath path;path.moveTo(radius, radius);//移动圆心path.arcTo(rectf, 90, 90);painter.drawPath(path);   //画路径(扇形)//左边linearGradient.setStart(radius, height/2);linearGradient.setFinalStop(0, height/2);painter.setBrush(linearGradient);path.clear();path.addRect(0, radius, radius, height - radius*2);painter.drawPath(path);//左下角radialGradient.setCenter(radius, height - radius); //中心点radialGradient.setRadius(radius); //半径radialGradient.setFocalPoint(radius, height - radius); //焦点painter.setBrush(radialGradient);path.clear();path.moveTo(radius, height - radius);//移动圆心rectf.setRect(0, height - radius*2, radius*2, radius*2);path.arcTo(rectf, 180, 90);painter.drawPath(path);   //画路径(扇形)//下边linearGradient.setStart(width/2, height - radius);linearGradient.setFinalStop(width/2, height);painter.setBrush(linearGradient);path.clear();path.addRect(radius, height - radius, width - radius*2, radius);painter.drawPath(path);//右下角radialGradient.setCenter(width - radius, height - radius); //中心点radialGradient.setRadius(radius); //半径radialGradient.setFocalPoint(width - radius, height - radius); //焦点painter.setBrush(radialGradient);path.clear();path.moveTo(width - radius, height - radius);//移动圆心rectf.setRect(width - radius*2, height - radius*2, radius*2, radius*2);path.arcTo(rectf, 270, 90);painter.drawPath(path);   //画路径(扇形)//右边linearGradient.setStart(width - radius, height/2);linearGradient.setFinalStop(width, height/2);painter.setBrush(linearGradient);path.clear();path.addRect(width - radius, radius, radius, height - radius*2);painter.drawPath(path);//右上角radialGradient.setCenter(width - radius, radius); //中心点radialGradient.setRadius(radius); //半径radialGradient.setFocalPoint(width - radius, radius); //焦点painter.setBrush(radialGradient);path.clear();path.moveTo(width - radius, radius);//移动圆心rectf.setRect(width - radius*2, 0, radius*2, radius*2);path.arcTo(rectf, 0, 90);painter.drawPath(path);   //画路径(扇形)//上边linearGradient.setStart(height/2, radius);linearGradient.setFinalStop(height/2, 0);painter.setBrush(linearGradient);path.clear();path.addRect(radius, 0, width - radius*2, radius);painter.drawPath(path);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/339284.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pyqt treeWidget树生成

生成treeWidget树与获取treeWidget树节点的数据 # encodingUTF-8 import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication, QTreeWidgetItem, QLineEdit, QSpinBox, QComboBox from PyQt5.QtWidgets import QWidget from release_test import Ui_F…

既然所有ERP系统都很烂,那创业公司有没有机会?

既然所有ERP系统都烂,那创业公司有没机会? 得一点点把这问题捋顺了再回答—— 先说说“都很烂”这个判断是否准确谈谈国产ERP和国际ERP厂商&#xff0c;新创公司是否有优势&#xff1f;最后聊一下创业本身&#xff0c;如何创业、风险如何…… 一些人可能对传统的ERP系统感到…

基于ChatGPT4+Python近红外光谱数据分析及机器学习与深度学习建模

022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年4月&#xff0c;更强版本的ChatGPT4.0上线&#xff0c;文本、语音、图像等多模态交互方式使其在…

监测服务器硬件设备运行状况的软件 - wgcloud

WGCLOUD是一款开源免费的运维平台&#xff0c;具有轻量&#xff0c;高效&#xff0c;性能稳定&#xff0c;部署简单&#xff0c;上手容易等特点 WGCLOUD可以监测服务器的cpu&#xff0c;内存&#xff0c;磁盘&#xff0c;负载&#xff0c;磁盘&#xff0c;缓存&#xff0c;网络…

LeetCode刷题--- 地下城游戏

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述动…

Java研学-三层架构实现简单登录操作

一 登录流程 将服务器资源给有权限的人访问&#xff0c;只有登录的管理员可以访问员工信息进行 CRUD 二 三层架构 Web 开发中的最佳实践&#xff1a;分层开发模式将整个业务应用划分为&#xff1a;表现层、业务逻辑层、数据访问层。区分层次的目的即为了“高内聚低耦合”的思想…

计算机毕业设计-----SSH校园精品课程网前后台

项目介绍 本项目是很不错的一个校园精品课程网源码&#xff0c;前台和后台源码都有&#xff0c;分为管理员与学生两种角色&#xff1b; 前台功能&#xff1a;网站首页&#xff0c;校园新闻&#xff0c;课程中心&#xff0c;资源下载&#xff0c;互动交流&#xff0c;个人中心…

树状结构查询 - 华为OD统一考试

OD统一考试 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 通常使用多行的节点、父节点表示一棵树&#xff0c;比如&#xff1a; 西安 陕西 陕西 中国 江西 中国 中国 亚洲 泰国 亚洲 输入一个节点之后&#xff0c;请打印出来树中他的所有下层节点。 …

删除sys_file表中的文件信息后同步操作表单中对应的文件字段信息

需求&#xff1a;由于系统的表单文件上传/删除操作与表单的保存操作不同时进行&#xff0c;所以需要调整 细节&#xff1a;&#xff08;某个表&#xff1a;A表&#xff09;表单的文件字段只是保存了上传文件的id&#xff0c;名称&#xff0c;真正的文件保存是保存在一个系统的文…

Retrieval-Augmented Generation for Large Language Models: A Survey

PS: 梳理该 Survey 的整体框架&#xff0c;后续补充相关参考文献的解析整理。本文的会从两个角度来分析总结&#xff0c;因此对于同一种技术可能在不同章节下都会有提及。第一个角度是从整体框架的迭代来看&#xff08;对应RAG框架章节&#xff09;&#xff0c;第二个是从RAG中…

转专业(UPC练习)

题目描述 根据教育部的规定&#xff0c;大学生进校后符合条件的可申请转专业。在校本科生在完成大学一年级课程&#xff0c;进入二年级之前&#xff0c;符合以下条件之一者&#xff0c;可以申请转专业&#xff1a;&#xff08;1&#xff09;在某一学科方面确有特长的学生&#…

IPv6路由协议---IPv6动态路由(OSPFv3-5)

OSPFv3各链路状态通告类型 4.Inter-Area-Router-LSA区域间路由器(4类LSA) 边界路由器(ABR)产生的第4类LSA,在Area 范围内泛洪,描述了到本AS内其他区域的ASBR路由器信息; 每各Inter-Area-Router-LSA包含一个ASBR路由器信息,LSA中的能力选项(Options)与所描述的ASBR …