QPainterPath 不规则提示框(二)
前一篇讲过不规则提示框,但是提示框的方向是固定的,不能达到随意变换方向的效果,本接讲述可以动态变换方向的提示框
先看效果图
如上图1所示,上一篇文章的代码可以达到类似效果
本片文章我只介绍变动部分,尽可能的做到详细吧
我先说原理,整个窗口包含两个布局器,水平布局和垂直布局,还有2个空间填充器,最后一个当然是显示消息的窗口,显示消息的窗口可以定制
整个窗口可以使用ui来做,也可以使用纯代码来控制,我使用了ui做布局部分,如图5,空间填充器是动态加入到布局中的,代码如下
1 case TOPLEFT://箭头朝左上 2 3 { 4 5 ui->horizontalLayout->addSpacerItem(new QSpacerItem(size().width() / 8, 0 6 7 , QSizePolicy::Maximum, QSizePolicy::Minimum)); 8 9 ui->horizontalLayout->addWidget(_p->messageWidget);//消息显示窗口 10 11 ui->horizontalLayout->setStretch(0, 1);//设置空格和窗口长度比例 12 13 ui->horizontalLayout->setStretch(1, 7); 14 15 ui->verticalLayout->insertSpacerItem(0, new QSpacerItem(0, size().height() / 2 16 17 , QSizePolicy::Minimum, QSizePolicy::Maximum)); 18 19 ui->verticalLayout->setStretch(0, 1); 20 21 ui->verticalLayout->setStretch(1, 1); 22 23 } 24 25 break; 26 27 case BOTTOMLEFT://箭头朝左下 28 29 { 30 31 ui->horizontalLayout->addSpacerItem(new QSpacerItem(size().width() / 8, 0 32 33 , QSizePolicy::Maximum, QSizePolicy::Minimum)); 34 35 ui->horizontalLayout->addWidget(_p->messageWidget); 36 37 ui->horizontalLayout->setStretch(0, 1); 38 39 ui->horizontalLayout->setStretch(1, 7); 40 41 ui->verticalLayout->addSpacerItem(new QSpacerItem(0, size().height() / 2 42 43 , QSizePolicy::Minimum, QSizePolicy::Maximum)); 44 45 ui->verticalLayout->setStretch(0, 1); 46 47 ui->verticalLayout->setStretch(1, 1); 48 49 } 50 51 break; 52 53 case BOTTOMRIGHT://箭头朝 右下 54 55 { 56 57 ui->horizontalLayout->addWidget(_p->messageWidget); 58 59 ui->horizontalLayout->addSpacerItem(new QSpacerItem(0, 0 60 61 , QSizePolicy::Expanding, QSizePolicy::Minimum)); 62 63 ui->horizontalLayout->setStretch(0, 7); 64 65 ui->horizontalLayout->setStretch(1, 1); 66 67 ui->verticalLayout->addSpacerItem(new QSpacerItem(0, 0 68 69 , QSizePolicy::Minimum, QSizePolicy::Expanding)); 70 71 ui->verticalLayout->setStretch(0, 1); 72 73 ui->verticalLayout->setStretch(1, 1); 74 75 } 76 77 break; 78 79 case TOPRIGHT://箭头朝右上 80 81 { 82 83 ui->horizontalLayout->addWidget(_p->messageWidget); 84 85 ui->horizontalLayout->addSpacerItem(new QSpacerItem(0, 0 86 87 , QSizePolicy::Expanding, QSizePolicy::Minimum)); 88 89 ui->horizontalLayout->setStretch(0, 7); 90 91 ui->horizontalLayout->setStretch(1, 1); 92 93 ui->verticalLayout->insertSpacerItem(0, new QSpacerItem(0, 0 94 95 , QSizePolicy::Minimum, QSizePolicy::Expanding)); 96 97 ui->verticalLayout->setStretch(0, 1); 98 99 ui->verticalLayout->setStretch(1, 1); 100 101 } 102 103 break;
View Code
整个窗口背景色透明后需要自己绘制窗口颜色,长款北京形状创建代码如下
1 QPainterPath rectPath, triPath; 2 3 switch (posStyle) 4 5 { 6 7 case 1: 8 9 { 10 11 rectPath.addRoundRect(QRect(size.width() / 8 12 13 , size.height() / 2 14 15 , size.width() / 8 * 7 16 17 , size.height() / 2) 18 19 , 10); 20 21 triPath.moveTo(0, 0); 22 23 triPath.lineTo(size.width() / 4, size.height() / 2); 24 25 triPath.lineTo(size.width() / 8 * 3, size.height() / 2); 26 27 triPath.lineTo(0, 0); 28 29 } 30 31 break; 32 33 case 2: 34 35 { 36 37 rectPath.addRoundRect(QRect(0 38 39 , size.height() / 2 40 41 , size.width() / 8 * 7 42 43 , size.height() / 2) 44 45 , 10); 46 47 triPath.moveTo(size.width(), 0); 48 49 triPath.lineTo(size.width() / 4 * 3, size.height() / 2); 50 51 triPath.lineTo(size.width() / 8 * 5, size.height() / 2); 52 53 triPath.lineTo(size.width(), 0); 54 55 } 56 57 break; 58 59 case 3: 60 61 { 62 63 rectPath.addRoundRect(QRect(0 64 65 , 0 66 67 , size.width() / 8 * 7 68 69 , size.height() / 2) 70 71 , 10); 72 73 triPath.moveTo(size.width(), size.height()); 74 75 triPath.lineTo(size.width() / 4 * 3, size.height() / 2); 76 77 triPath.lineTo(size.width() / 8 * 5, size.height() / 2); 78 79 triPath.lineTo(size.width(), size.height()); 80 81 } 82 83 break; 84 85 case 4: 86 87 { 88 89 rectPath.addRoundRect(QRect(size.width() / 8 90 91 , 0 92 93 , size.width() / 8 * 7 94 95 , size.height() / 2) 96 97 , 10); 98 99 triPath.moveTo(0, size.height()); 100 101 triPath.lineTo(size.width() / 4, size.height() / 2); 102 103 triPath.lineTo(size.width() / 8 * 3, size.height() / 2); 104 105 triPath.lineTo(0, size.height()); 106 107 } 108 109 break; 110 111 } 112 113 rectPath.addPath(triPath); //添加子闭合路径 114 115 return rectPath;
View Code
如此创建的提示窗口,在使用过程中需要用户根据箭头的指向 自己去移动窗口,paintEvent函数没有变化
================================================
前边介绍的这两种不规则图形的绘制都是直接绘制在窗口上的,接下来我再介绍一种绘制不规则图形的方式,只做大概讲述,具体实现代码我就不做过多的讲解 了,这种方式的原理就是贴图,我们把想要绘制的不规则图形先绘制到图片上,然后对图片做各种处理,比如旋转、镜像、平移等操作,然后在把图片绘制到窗口 上,这样做的好处是,这个不规则的形状可以随意变化,而不需要更改很多的代码。下面我写一下这种方式的伪代码
void 窗口重回函数()
{
根据QImage构造QPainter对象或者指针
构造如图1所示的不规则QPainterPath路径
使用绘图对象把该路径绘制到QImage上
使用绘图对象把QImage绘制到窗口上
}
转载于:https://www.cnblogs.com/swarmbees/p/5621514.html
QPainterPath 不规则提示框(二)相关推荐
- ios 系统提示框_二个消息:关于iOS12.2和iOS13 beta 1系统功能
今天分享最新三条消息: 1.iOS12.2 取消低电量提示声 2.iOS13 beta 1 曝光新功能 一.iOS12.2 取消低电量提示声 国行版设备 iOS12.2 取消低电量提示声,在此之前旧版 ...
- php 消息对话框弹出,php弹窗代码_php弹出消息提示框的二种方法
摘要 腾兴网为您分享:php弹出消息提示框的二种方法,优衣库,新浪博客,万师傅,顺丰等软件知识,以及符号,甘肃农商银行,彗星小,kindle人社区,广东省公务用车管理,宝鸡在线,火影忍者英文版,寂静岭 ...
- html输入提示框点击确认显示内容,前端 自定义确认提示框(二)
以上demo,完整案例请下载:example-MyconfirmDialog 或者访问github地址:https://github.com/Kybs0/Kybs0HtmlCssJsDemo/tree ...
- 扩展金山提示框,使之带颜色(二)
动态提示框最好能有三个功能:1.动态地改变大小 2.支持多种颜色 3.能有个确定按钮 1.用xml给提示框来个布局. <layer><header class="msgbo ...
- Arc Engine 中添加气泡提示框
一.在ArcMap中的定位操作 已知若干点的经纬度坐标,要求在地图中进行定位: 1.通过Tool >Add X Y data 定位点,注意选择地理坐标系下的wgs 1984坐标系: 2.定位后的 ...
- ios 系统提示框_经验分享:新购买移动硬盘格式化为Windows系统和Mac系统同时可以使用的方法...
经常使用硬盘的小伙伴们都知道,新买的移动硬盘,要想在Windows系统使用的话是可以直接使用的,因为一般情况下新买的移动硬盘格式是适用于Windows系统的NTFS格式:如果想让该移动硬盘也能在苹果的 ...
- 登录系统 提示框_实物资产管理软件操作手册(职员和系统用户)
一.职员和系统用户 "职员和系统用户"菜单提供了对公司人员信息进行维护的功能,可以自定义职员编码. 姓名.用户名等相关职员信息. 注意:职员编码.用户名需唯一,且用户名一旦保存则不 ...
- Bootstrap实现弹出框和提示框效果代码
一.Bootstrap弹出框 使用过JQuery UI应该知道,它里面有一个dialog的弹出框组件,功能也很丰富.与jQuery UI的dialog类似,Bootstrap里面也内置了弹出框组件.打 ...
- 三、bootstrap4 组件(警告和提示框、徽章和面包屑、按钮按钮组、卡片、列表组、导航和选项卡、分页和进度条、巨幕和旋转图标、轮播图、折叠菜单、下拉菜单、导航条、滚动监听、轻量弹框、模态框、表单)
1.1 警告提示框 1.2 徽章和面包屑 1.3 按钮和按钮组 1.4 卡片 1.5 列表组 1.6 导航和选项卡 1.7 分页和进度条 1.8 巨幕和旋转图标 1.9 轮播图 1.10 折叠菜单 1 ...
最新文章
- VTK:PolyData之Reflection
- vue打包成app后,背景图片不显示
- inkscape使用_如何用Inkscape制作万圣节灯笼
- react 全选反选_js中怎么将createElement出来的复选框实现全选,全不选,反选效果?...
- Echart极坐标间隔显示-单类目轴
- 学习python内一般函数知识
- .NET单元测试(四):用例设计
- Arduino-atmega328p最小系统
- TFS2010中如何添加用户
- 【火炉炼AI】机器学习052-OpenCV构建人脸鼻子眼睛检测器
- 东方联盟创始人郭盛华:互联网守护神的传奇故事
- 谷歌浏览器常用的搜索语法
- Python:实现binomial distribution二项分布算法(附完整源码)
- Python读文件的三种方法对比
- 微信小程序解码emoji表情
- r2_score与accuracy_score的区别
- 神经网络程序设计学习心得
- 年终盘点丨细数2017云栖社区20大热点话题(附100+话题清单)
- 5分钟LaTex快速入门(超简洁全面)
- 浙江网新恒天软件有限公司企业云报表集成解决方案