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.mzph.cn/news/613893.shtml

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

相关文章

多态、抽象类和接口(深拷贝和浅拷贝)

目录​​​​​​​ 前言&#xff1a; 多态&#xff1a; 多态的定义&#xff1a; 向上转型&#xff1a; 方法重写&#xff1a; 再看toString方法&#xff1a; 动态绑定&#xff1a; 向下转型&#xff1a; 小练习&#xff1a; 抽象类&#xff1a; 什么是抽象类&am…

Logstash应用-同步ES(elasticsearch)到HDFS

1.场景分析 现有需求需要将elasticsearch的备份至hdfs存储&#xff0c;根据以上需求&#xff0c;使用logstash按照天级别进行数据的同步 2.重难点 数据采集存在时间漂移问题&#xff0c;数据保存时使用的是采集时间而不是数据生成时间采用webhdfs无法对文件大小进行设置解决…

水产冷链物流行业零下25℃库架一体 海格里斯HEGERLS四向穿梭式冷藏冷库智能密集仓

随着国内外仓储物流整体规模和低温产品消费需求的稳步增长&#xff0c;冷链市场应用潜力不断释放。在传统“货架叉车”的方式下&#xff0c;货物、人员及机械设备不断进出&#xff0c;容易造成温度波动&#xff0c;导致冷量流失。立体冷库则以更高密度、更具成本效益的方式&…

性能测试中TPS上不去的几种原因浅析

昨晚在某个测试群看到有人问了一个问题&#xff1a;压力测试中TPS一直上不去&#xff0c;是什么原因&#xff1f;稍微整理了下思路&#xff0c;列举性的简略回答了他的问题。 这篇博客&#xff0c;就具体说说在实际压力测试中&#xff0c;为什么有时候TPS上不去的原因。如有遗…

C++学习笔记(三十五):c++ 函数指针及lambda表达式

本节介绍c函数指针。在一些源码中经常能看到c函数指针&#xff0c;但之前一直觉着这一块比较复杂&#xff0c;就一直没去仔细研究&#xff0c;终于有时间去仔细研究这一块内容了。 c风格的函数指针 函数指针是指将一个函数赋值给一个变量的方法&#xff0c;可以将函数作为一个参…

Vercel配置自定义域名

首先你需要有一个域名 1.点击部署的项目设置 2.找到Domains 3.输入自己的域名 点击添加之后按要求去域名服务商添加解析即可 4.显示下面内容就设置完成了&#xff0c;

Ubuntu下wifi 无线网络的配置

先说结论&#xff1a;终端模式下没有找到无脑安装的方法&#xff0c;也就是需要修改配置文件。 首先安装相关库 sudo apt install network-manager wpasupplicant wireless-tools然后到/etc/netplan目录下&#xff0c;配置50-cloud-init.yaml文件。如果没有这个文件&#xff0…

激活/注册navicat15

一、获取软件 链接&#xff1a;https://pan.baidu.com/s/1F_tiLuLvVFMEz8pDfIvDjw?pwdjjfj 提取码&#xff1a;jjfj 二、安装 安装的过程我就不放了&#xff0c;重点如下 安装完不要打开软件&#xff01; 安装完不要打开软件&#xff01; 安装完不要打开软件&#xff01;…

强化学习求解TSP(三):Qlearning求解旅行商问题TSP(提供Python代码)

一、Qlearning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于奖励的决策问题。它是一种无模型的学习方法&#xff0c;通过与环境的交互来学习最优策略。Q-learning的核心思想是通过学习一个Q值函数来指导决策&#xff0c;该函数表示在给定状态下采取某个动作所获…

【响应式编程】前置知识和相关技术的总结

前置知识 这些概念都与响应式编程密切相关。&#x1f98c; 1. 并发和多线程编程&#xff1a;响应式编程需要处理并发性&#xff0c;它允许多个操作独立地并行执行。这使得应用程序可以在不同的线程、进程或设备上处理多个事件。 2. 事件驱动编程&#xff1a;响应式编程是一种…

回首24考研历程,那些无法忘却的收获

文章目录 毅力与坚持&#x1f44d;知识的力量&#x1f9d0;心态的历练&#x1f913;友谊与互助( •̀ ω •́ )y未来的启示(●◡●) 在这个充满希望与挑战的时刻&#xff0c;我想与你们分享一段关于2023这一年特别的经历——考研之路。这段旅程既有磨砺的痛楚&#xff0c;也有…

小程序基础学习(事件处理)

概述&#xff1a;点击某一个标题&#xff0c;使标题选中增加不同颜色。 <!--pages/four/four.wxml--> <navigation-bar title"牧原" back"{{false}}" color"black" background"#FFF"></navigation-bar> <view c…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷⑩

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷10 目录 需要竞赛软件包环境以及备赛资源可私信博主&#xff01;&#xff01;&#xff01; 2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷10 模块…

RT-Thread: ulog 日志 讲解和使用

说明&#xff1a;记录 RT-Thread: ulog 日志功能和使用流程。 官网资料链接&#xff1a; https://docs.rt-thread.org/#/rt-thread-version/rt-thread-standard/programming-manual/ulog/ulog 1.ulog 简介 日志的定义&#xff1a;日志是将软件运行的状态、过程等信息&#x…

海外市场调研为什么要用独享静态代理IP?

独享静态IP在海外市场调研中扮演着至关重要的角色&#xff0c;提供了一系列无可比拟的优势。独享静态代理IP的稳定性和可靠性对于长期的市场调研至关重要&#xff0c;它保证了连接的持续性和数据的准确性。通过这些方面的综合优势&#xff0c;独享静态代理IP成为海外市场调研中…

工业智能网关:HiWoo Box远程采集设备数据

工业智能网关&#xff1a;HiWoo Box远程采集设备数据 在工业4.0和智能制造的浪潮下&#xff0c;工业互联网已成为推动产业升级、提升生产效率的关键。而在这其中&#xff0c;工业智能网关扮演着至关重要的角色。今天&#xff0c;我们就来深入探讨一下工业智能网关。 一、什么…

用Linux的视角来理解缓冲区概念

缓冲区的认识 缓冲区&#xff08;buffer&#xff09;是存储数据的临时存储区域。当我们用C语言向文件中写入数据时&#xff0c;数据并不会直接的写到文件中&#xff0c;中途还经过了缓冲区&#xff0c;而我们需要对缓冲区的数据进行刷新&#xff0c;那么数据才算写到文件当中。…

C++中ios::in, ios::out, ios::trunc使用

目录 一&#xff0c;ios::in 二&#xff0c;ios::out 三&#xff0c;ios::trunc 四&#xff0c;组合使用 在C中&#xff0c;ios::in和ios::out是iostream库中定义的一些标志&#xff0c;用于控制文件流对象&#xff08;如fstream、ifstream和ofstream&#xff09;的行为。…

Java获取IP地址及对应的归属地

目录 前言 一、获取访问的IP地址 二、通过IP地址获取对应的归属地 2.1 Ip2region 2.1.1 高达 99.9 % 的查询准确率 2.1.2 Ip2region V2.0 特性 2.1.3 多语言以及查询客户端的支持 2.2 Ip2region xdb Java 查询客户端实现 2.2.1 引入 Maven 仓库 2.2.2 ip2region.xdb …

【.NET Core】可为null类型详解

【.NET Core】可为null类型详解 文章目录 【.NET Core】可为null类型详解一、概述二、可为空的值类型2.1 声明和赋值2.2 检查可为空值类型2.3 基础类型与可为空的值类型互换2.4 可为空的值类型装箱和取消装箱2.5 如何确定可为空的值类型 三、可为 null 的引用类型 一、概述 nu…