当前位置: 首页 > news >正文

【QT学习】如何绘制圆角窗口?(完整源码)

文章目录

  • 前言
  • 一、实现效果
  • 二、基础知识
    • 1.QBitmap类
    • 2.QPainter类
    • 3.setMask函数
  • 三、实现代码
  • 总结


前言

   在使用QT创建窗口时,所创建出来的默认窗口都是矩形的。当我们隐藏默认标题栏,想自己绘制自定义的标题栏时,就会发现矩形的窗口过于棱角分明。本篇,作者将分享如何绘制一个圆角窗口,摆脱矩形窗口所带来的突兀感。


一、实现效果

  • 作者使用该方法,绘制了一个圆角注册界面的雏形,如下图所示。

在这里插入图片描述

二、基础知识

1.QBitmap类

(1)QBitmap表示一种只有黑白的单色图片,即位图。由于色深小,只占用很少的存储空间,适合做笔刷。

(2)QBitmap类常用API函数如下所示:

  • 构造一个给定大小的位图
	QBitmap(const QSize &size);		
  • 清除位图,将其所有位设置为 Qt::color0
	void clear();
  • QBitmap类继承QPixmap类的方法,返回一个像素矩形图片
	QRect rect() const;
  • QBitmap类继承QPixmap类的方法,填充某种颜色到图片中,默认为白色
	void fill(const QColor &color = Qt::white);

2.QPainter类

(1)在Qt绘图系统中,由QPainter来完成绘制操作。具体过程:创建QPainter;图形的绘制;销毁QPainter。

(2)QPainter类常用API函数如下所示:

  • QPainter构造函数,device指定绘图对象(设备),device可以是一个窗口或一张图片
	QPainter(QPaintDevice *device);
  • 设置画笔函数,指定图案的轮廓样式
    //使用画笔,设置画笔的风格
    QPen pen(Qt::red,6);
    painter.setPen(pen);
    //若绘制无轮廓图案(只有填充颜色),可以设置QPainter为Qt::NoPen
    painter.setPen(Qt::NoPen);
  • 设置画刷函数,指定图案的填充样式
    // 创建画刷,设置画刷的颜色
    QBrush brush(Qt::black);
    // 使用画刷
    painter.setBrush(brush);
  • 绘制圆角矩形函数
	QPainter::drawRoundedRect(const QRectF &rect, qreal xRadius, qreal yRadius);

3.setMask函数

  • 窗口的图形遮罩功能,用于某些场合下需要制作非规则图形显示
	void QWidget::setMask(const QBitmap &bitmap);

以上方式是用位图实现的遮罩,当位图的像素为1时,遮挡部位才可见。

三、实现代码

  • 掌握了以上基本知识后,我们就可以开始实现圆角窗口的绘制,具体代码如下所示。
regscreen::regscreen(QWidget *parent) : QWidget(parent)
{
    //设置登录窗口大小
    this->setFixedSize(360,640);
    
	//创建与窗口等大的位图
	QBitmap bmp(this->size());    
	//创建的位图填充为白色           		
    bmp.fill();     
    
    //将图片添加为绘制对象                           		
    QPainter painter(&bmp); 
    //不使用画笔的线条绘制                    	
    painter.setPen(Qt::NoPen);
    //使用黑色画刷进行绘制                  	
    painter.setBrush(Qt::black);       
    //绘制圆角矩形,圆角半径40         	
    painter.drawRoundedRect(bmp.rect(),40,40);  	
    
    //使用圆角矩形位图对窗户实现遮罩(即圆角窗口)
    this->setMask(bmp);	
}							

总结

   以上就是【QT学习】如何绘制圆角窗口的所有内容,希望大家阅读后都能有所收获!原创不易,转载请标明出处,若文章出现有误之处,欢迎读者留言指正批评!

在这里插入图片描述

相关文章:

  • 部署vue element-ui admin报错(vue2)
  • C#面向对象程序设计课程实验五:实验名称:C#面向对象技术
  • [Codeforces] combinatorics (R1600) Part.2
  • 【LC】反转链表, 相交链表, 环形链表
  • 【Java】之集合总结(上)
  • Redis中加锁的lua脚本的源码
  • Mac电脑解决Google翻译失效实用方法
  • 【易购管理系统】商品列表
  • 北斗导航 | RTKLib中的模型和算法(一)—— 时间系统
  • 【论文阅读】自动作文评分系统:一份系统的文献综述
  • avformat_open_input() 代码分析
  • Spring Bean的生命周期、Java配置BeanFactoryPostProcessor失效与解决
  • 大模型系统和应用——高效训练模型压缩
  • “华为杯”第十八届中国研究生数学建模竞赛一等奖经验分享
  • C#的StreamReader类使用说明
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • classpath对获取配置文件的影响
  • js正则,这点儿就够用了
  • log4j2输出到kafka
  • pdf文件如何在线转换为jpg图片
  • Protobuf3语言指南
  • vue.js框架原理浅析
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 复习Javascript专题(四):js中的深浅拷贝
  • 构建工具 - 收藏集 - 掘金
  • 讲清楚之javascript作用域
  • 区块链共识机制优缺点对比都是什么
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 使用 Docker 部署 Spring Boot项目
  • 温故知新之javascript面向对象
  • 原生JS动态加载JS、CSS文件及代码脚本
  • ​如何在iOS手机上查看应用日志
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #1015 : KMP算法
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • $GOPATH/go.mod exists but should not goland
  • $NOIp2018$劝退记
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (solr系列:一)使用tomcat部署solr服务
  • (二)c52学习之旅-简单了解单片机
  • (南京观海微电子)——COF介绍
  • (一)80c52学习之旅-起始篇
  • (转)jdk与jre的区别
  • .net core使用ef 6
  • .NET 设计一套高性能的弱事件机制
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .Net组件程序设计之线程、并发管理(一)
  • @DataRedisTest测试redis从未如此丝滑
  • @JSONField或@JsonProperty注解使用
  • @KafkaListener注解详解(一)| 常用参数详解
  • @Transactional类内部访问失效原因详解
  • [codeforces]Levko and Permutation
  • [Electron]ipcMain.on和ipcMain.handle的区别