【QT入门】 无边框窗口设计之实现圆角窗口

往期回顾:

【QT入门】对无边框窗口自定义标题栏并实现拖动和拉伸效果-CSDN博客

【QT入门】 自定义标题栏界面qss美化+按钮功能实现-CSDN博客

【QT入门】 无边框窗口设计之实现窗口阴影-CSDN博客

 【QT入门】 无边框窗口设计之实现圆角窗口

我们实际用到的很多窗口,其实都是带圆角的,所以这个知识点还是很有必要知道,有两种方法都可以实现圆角窗口,两个方法都需要重写void paintEvent(QPaintEvent* event) override。

一、最终效果

这里的效果用的是第二种,可以看到,左上角和右下角设置为了圆角,通过重写paintEvent方法我们可以实现精准控制哪个角设置为圆角,圆角半径为多大。
而如果是第一种,就是四个角都是圆角。

二、用Qt绘图框架绘制

1、初始化界面

void radius::initUIshang()
{
    resize(600, 400);

    setAttribute(Qt::WA_TranslucentBackground);  //设置窗口背景透明
    setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint);  //去掉窗口边框
}

 主要是先设置窗口背景透明和去掉窗口边框,这个常规操作了

2、重写paintEvent方法

void radius::paintEvent(QPaintEvent * event)
{
    QPainter painter(this);// 创建一个QPainter对象并指定绘制设备为this,即当前窗口
    painter.setRenderHint(QPainter::Antialiasing);  // 设置绘制选项为反锯齿,使绘制的图形边缘更加平滑
    painter.setBrush(QBrush(QColor(255, 255, 255))); 设置画刷颜色,这里为白色
    painter.setPen(Qt::transparent); 设置画笔颜色为透明,即不绘制边框线
    QRect rect = this->rect(); 获取当前窗口的矩形区域
    painter.drawRoundedRect(rect, 15, 15);  // 绘制一个带有圆角的矩形窗口,圆角半径为15px,如果把窗口设置成正方形,圆角半径设大,就会变成一个圆了

}

 创建对象,设置了反锯齿效果,设置画笔画刷颜色等,最重要的,drawRoundedRect方法设置圆角半径。

2.1drawRoundedRect
painter.drawRoundedRect(rect, 15, 15) 

 这个方法三个参数:

矩形的位置和大小(rect)定义了矩形窗口的位置和大小,通常是一个矩形的边界框。
水平方向的圆角半径(15)定义水平方向的圆角半径,控制矩形窗口的左上角和右上角的圆角大小。
垂直方向的圆角半径(15)定义垂直方向的圆角半径,控制矩形窗口的左上角和左下角的圆角大小。

此时右下角的圆角大小会与左上角的圆角大小相同,而右上角和左下角的圆角大小也会相同。

我们这里将这两个圆角半径设置为相同的值,都为15,那么绘制的矩形窗口将具有相同大小的圆角,使得整个窗口看起来更加圆润。

 当圆角半径的值设置得足够大时,如果矩形窗口的宽度和高度相等,就会变成一个圆形窗口,因为圆角的半径大于矩形的宽度或高度,导致整个矩形都被圆角所覆盖,从而呈现出一个圆形。

三、用Qt绘图风格绘制 

1、初始化界面

void radius::initUIxia()
{
    setAttribute(Qt::WA_TranslucentBackground);  //设置窗口背景透明
    setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint);  //去掉窗口边框

    //this->setStyleSheet("QWidget{background-color:#FFFFFF;border-radius:30px;}");
    this->setStyleSheet("QWidget{background-color:#FFFFFF;  \
        border-top-left-radius:15px;   \
        border-bottom-right-radius:15px; \
        }");
}

在初始化界面设置样式的时候,就可以指定哪个角设置为圆角,以及圆角半径大小。这里只设置了左上角和右下角。

左上角border-top-left-radius : 15px
右上角 border-top-right-radius: 15px;
左下角border-bottom-left-radius :5px;
右下角border-bottom-right-radius:5px;
border-radius的参数设置:
(1)可以只传一个参数,这样x, y方向的圆度是一样的,例如border-radius: 30px
(2)传两个参数  border-radius: 15px 20px  第一个参数设置X轴方向的半径,第二个参数设置Y轴方向的半径 

2、重写paintEvent方法

void radius::paintEvent(QPaintEvent*)
{
    QStyleOption opt;  // 创建一个QStyleOption对象
    opt.init(this);// 初始化QStyleOption对象,传入当前窗口指针
    QPainter p(this);// 创建一个QPainter对象,绘制设备为当前窗口

    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);// 使用当前窗口的绘图风格绘制小部件

}
 2.1QStyleOption

QStyleOption是Qt中用于传递样式选项的类,它在绘制控件时起着重要的作用。QStyleOption类提供了各种属性和方法,用于描述控件的外观和状态,以便样式系统能够正确地绘制控件。

其常见作用如下:

1、描述控件的状态QStyleOption可以描述控件的各种状态,如悬停、按下、选中等状态,以便样式系统能够根据状态来绘制控件。
2、传递控件的尺寸和位置QStyleOption可以包含控件的几何信息,如位置、大小、边界框等,以便样式系统能够根据几何信息来绘制控件。
3、传递控件的内容和文本QStyleOption可以包含控件的文本、图标等内容信息,以便样式系统能够在绘制时考虑内容的布局和显示。
4、传递用户定义的属性可以通过QStyleOption的扩展属性来传递自定义的属性信息,以便在绘制时能够根据这些属性做出相应的处理。
2.2drawPrimitive

drawPrimitive方法的四个参数也需要介绍一下(QStyle::PE_Widget, &opt, &p, this) 

1、QStyle::PrimitiveElement 类型的枚举值表示要绘制的元素类型

2、QStyleOption 类型的指针

表示绘制元素的选项
3、QPainter 类型的指针表示绘制的目标设备
4、QWidget 类型的指针表示与绘制相关联的小部件

从效果上来说,两个都是一样的,第二种方式可以实现更精细化的控制,因为四个角哪个用圆角哪个用平角都可以设置。

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

装饰工程管理系统|基于Springboot的装饰工程管理系统设计与实现(源码+数据库+文档)

装饰工程管理系统-项目立项子系统目录 目录 基于Springboot的装饰工程管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能实现 (2)合同报价管理 (3)装饰材料总计划管理 (4&#xff0…

基本线段树以及相关例题

1.线段树的概念 线段树是一种二叉树,也就是对于一个线段,我们会用一个二叉树来表示。 这个其实就是一个线段树,我们会将其每次从中间分开,其左孩子就是左边的集合的和,其右孩子就是右边集合的和; 我们可以…

前端返回 List<Map<String, Object>>中的vaue值里面包含一个Bigdecimal类型,序列化时小数点丢失,如何解决?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

Windows 11安装kb5035853补丁时,提示错误0x800f0922,并且弹出“某些操作未按计划进行,不必担心,正在撤消更改。请不要关机”

Windows 11安装kb5035853补丁时,提示错误0x800f0922,并且还在重启后弹出“某些操作未按计划进行,不必担心,正在撤消更改。请不要关机”,按微软官方的作法是:https://learn.microsoft.com/zh-cn/windows/rel…

基于SpringBoot和Vue的音乐在线交流网站的设计和实现【附源码】

1、系统演示视频(演示视频) 2、需要交流和学习请联系

【PLC一体机】GX Works2编程控制步进电机正反转

今天博主和大家分享一下在GX Works2 中对PLC一体机编程,实现步进电机自动正反转的程序。 程序如下: 该程序有几个重要的地方和大家分享一下: 1、程序以中间寄存器M4开头。 博主想通过PLC一体机上的触摸屏控制程序是否运行,因此…

多类别分类器(Machine Learning研习十八)

多类别分类器 二元分类器可以区分两个类别,而多类别分类器(也称为多叉分类器)可以区分两个以上的类别。 一些 Scikit-Learn 分类器(如 LogisticRegression、RandomForestClassifier 和 GaussianNB)能够原生处理多个类…

各类系统业务功能架构图整理

一、前言 很多软件系统一直经久不衰,主要这些系统都是一些生产工作经营不可或缺的系统。比如财务系统,商城系统,支付系统,供应链系统,人力资源管理系统,ERP系统等等。这些系统不管大公司还是小公司往往都需…

VSCode美化

今天有空收拾了一下VSCode,页面如下,个人觉得还是挺好看的~~ 1. 主题 Noctis 色彩较多,有种繁杂美。 我使用的是浅色主题的一款Noctis Hibernus 2. 字体 Maple Mono 官网:Maple-Font 我只安装了下图两个字体,使…

jvm总结学习

四种加载器 1.启动类加载器 2.拓展类加载器 3.应用程序加载器 4.自定义加载器 沙箱机制 就是为了保证安全,增加的一些权限。 native方法区(静态变量,常量,类信息(构造方法,接口定义)&…

Python 代码混淆工具概述

在保护Python代码安全方面,有多种混淆工具可供选择,包括 Cython, Nuitka, Pyminifier 和 IPA guard。本文将介绍这些工具的特点和适用情况,以及在实际应用中的注意事项。 📝 摘要 本文探讨了几种常见的 Python 代码混淆工具&am…

阿里云可观测 2024 年 3 月产品动态

本月可观测热文回顾 文章一览: 全新架构!日志服务 SLS 自研免登录方案发布 AIOps 智能运维:有没有比专家经验更优雅的错/慢调用分析工具? 一文看懂如何做好 SQL 质量监控 使用 SPL 高效实现 Flink SLS Connector 下推 功能快…

HbnnMall电子商城系统介绍(功能与技术栈)

今天在看我个人网站上的文章时,看到了曾经在2020年自己开发的电商系统。那时我已经入职小米有一段时间了,基本已经对各个业务线,各种业务知识有了系统性的了解和学习,所以想自己动手写一个电商系统,以便进一步提高自己…

LeetCode刷题实战1:两数之和

从今天开始加入刷题大军,把算法题刷爆,我们直接进入主题。 题目内容 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应…

经济学 生产成本 垄断

经济利润:收益-显性成本-隐性成本 会计利润:收益-显性成本 隐性成本:间接的机会成本 成本分为两种:可变成本和固定成本 可变成本:随着生产产品数量发生改变 固定成本 平均成本:每一单单位产品的成本 通…

二维码的生成、下载Java,并返回给前端展示

分析 将生成的二维码图片,以IO流的方式,通过response响应体直接返回给请求方。 第一、不需要落到我们的磁盘,操作在内存中完成,效率比较高。 第二、所有生成二维码的请求,都可以访问这里,前端直接拿img标…

vue想要突破全局样式限制又不影响别的页面样式怎么办

<!-- 用scope盖不住全局&#xff0c;随意来个class匹配私定&#xff0c;搜索关键词&#xff1a;不要随便改&#xff0c;乱打class名 --> <style> .lkajsdfjkalsfhkljashkflhaskl .el-input.el-input--default.el-input--suffix { width: 160px !important; } …

MySQL索引原理

MySQL索引原理 1、Innodb中的B树是怎么产生的呢? 背景1.1、mysql索引使用B树&#xff0c;为什么&#xff1f;1.2、主键索引图示1.3、mysql最好使用自增ID&#xff1a;为什么呢&#xff1f;1.4、高度为3的B树能存多少条数据&#xff1f;a、假设2层b、假设3层 2、索引采用什么数…

从0到1构建uniapp应用-store状态管理

背景 在 UniApp的开发中&#xff0c;状态管理的目标是确保应用数据的一致性&#xff0c;提升用户体验&#xff0c;并简化开发者的工作流程。通过合理的状态管理&#xff0c;可以有效地处理用户交互、数据同步和界面更新等问题。 此文主要用store来管理用户的登陆信息。 重要…

python--面向对象编程和类的定义,对象的创建

一、面向对象简介 1、什么是面向对象 面向对象是一种编程思想&#xff0c;把数据和对数据的多个操作方法封装在一起组成类&#xff0c;这样通过这个类创建出来的对象,就可以直接调用这些方法了。 2、面向对象相关的术语 类&#xff1a;用来描述具有相同的属性和方法的对象的…