前一篇讲过不规则提示框,但是提示框的方向是固定的,不能达到随意变换方向的效果,本接讲述可以动态变换方向的提示框

先看效果图

图1
图2
图3
图4

如上图1所示,上一篇文章的代码可以达到类似效果

​本片文章我只介绍变动部分,尽可能的做到详细吧

​​我先说原理,整个窗口包含两个布局器,水平布局和垂直布局,还有2个空间填充器,最后一个当然是显示消息的窗口,显示消息的窗口可以定制

图5

整个窗口可以使用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 不规则提示框(二)相关推荐

  1. ios 系统提示框_二个消息:关于iOS12.2和iOS13 beta 1系统功能

    今天分享最新三条消息: 1.iOS12.2 取消低电量提示声 2.iOS13 beta 1 曝光新功能 一.iOS12.2 取消低电量提示声 国行版设备 iOS12.2 取消低电量提示声,在此之前旧版 ...

  2. php 消息对话框弹出,php弹窗代码_php弹出消息提示框的二种方法

    摘要 腾兴网为您分享:php弹出消息提示框的二种方法,优衣库,新浪博客,万师傅,顺丰等软件知识,以及符号,甘肃农商银行,彗星小,kindle人社区,广东省公务用车管理,宝鸡在线,火影忍者英文版,寂静岭 ...

  3. html输入提示框点击确认显示内容,前端 自定义确认提示框(二)

    以上demo,完整案例请下载:example-MyconfirmDialog 或者访问github地址:https://github.com/Kybs0/Kybs0HtmlCssJsDemo/tree ...

  4. 扩展金山提示框,使之带颜色(二)

    动态提示框最好能有三个功能:1.动态地改变大小 2.支持多种颜色 3.能有个确定按钮 1.用xml给提示框来个布局. <layer><header class="msgbo ...

  5. Arc Engine 中添加气泡提示框

    一.在ArcMap中的定位操作 已知若干点的经纬度坐标,要求在地图中进行定位: 1.通过Tool >Add X Y data 定位点,注意选择地理坐标系下的wgs 1984坐标系: 2.定位后的 ...

  6. ios 系统提示框_经验分享:新购买移动硬盘格式化为Windows系统和Mac系统同时可以使用的方法...

    经常使用硬盘的小伙伴们都知道,新买的移动硬盘,要想在Windows系统使用的话是可以直接使用的,因为一般情况下新买的移动硬盘格式是适用于Windows系统的NTFS格式:如果想让该移动硬盘也能在苹果的 ...

  7. 登录系统 提示框_实物资产管理软件操作手册(职员和系统用户)

    一.职员和系统用户 "职员和系统用户"菜单提供了对公司人员信息进行维护的功能,可以自定义职员编码. 姓名.用户名等相关职员信息. 注意:职员编码.用户名需唯一,且用户名一旦保存则不 ...

  8. Bootstrap实现弹出框和提示框效果代码

    一.Bootstrap弹出框 使用过JQuery UI应该知道,它里面有一个dialog的弹出框组件,功能也很丰富.与jQuery UI的dialog类似,Bootstrap里面也内置了弹出框组件.打 ...

  9. 三、bootstrap4 组件(警告和提示框、徽章和面包屑、按钮按钮组、卡片、列表组、导航和选项卡、分页和进度条、巨幕和旋转图标、轮播图、折叠菜单、下拉菜单、导航条、滚动监听、轻量弹框、模态框、表单)

    1.1 警告提示框 1.2 徽章和面包屑 1.3 按钮和按钮组 1.4 卡片 1.5 列表组 1.6 导航和选项卡 1.7 分页和进度条 1.8 巨幕和旋转图标 1.9 轮播图 1.10 折叠菜单 1 ...

最新文章

  1. VTK:PolyData之Reflection
  2. vue打包成app后,背景图片不显示
  3. inkscape使用_如何用Inkscape制作万圣节灯笼
  4. react 全选反选_js中怎么将createElement出来的复选框实现全选,全不选,反选效果?...
  5. Echart极坐标间隔显示-单类目轴
  6. 学习python内一般函数知识
  7. .NET单元测试(四):用例设计
  8. Arduino-atmega328p最小系统
  9. TFS2010中如何添加用户
  10. 【火炉炼AI】机器学习052-OpenCV构建人脸鼻子眼睛检测器
  11. 东方联盟创始人郭盛华:互联网守护神的传奇故事
  12. 谷歌浏览器常用的搜索语法
  13. Python:实现binomial distribution二项分布算法(附完整源码)
  14. Python读文件的三种方法对比
  15. 微信小程序解码emoji表情
  16. r2_score与accuracy_score的区别
  17. 神经网络程序设计学习心得
  18. 年终盘点丨细数2017云栖社区20大热点话题(附100+话题清单)
  19. 5分钟LaTex快速入门(超简洁全面)
  20. 浙江网新恒天软件有限公司企业云报表集成解决方案

热门文章

  1. JS小数位保留两位小数
  2. php ×××号码效验码生成函数
  3. Silverlight Gantt轻量级高性能的甘特图
  4. HP-UX Root密码被锁定的非关机情况下解决方案
  5. 《分布式服务架构:原理、设计与实战》第二章彻底解决分布式系统一致性的问题...
  6. PHP大数组过滤元素、修改元素性能分析
  7. window powershell 获取前后日期,格式化日期
  8. Nginx 学习总结(2) —— 基本配置
  9. ASP.NET: 简要分析Table类的使用
  10. BZOJ-1854-[Scoi2010]游戏(并查集)