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

先看效果图

图1
图2
图3
图4

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

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

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

图5

整个窗口可以使用ui来做,也可以使用纯代码来控制,我使用了ui做布局部分,如图5,空间填充器是动态加入到布局中的​​,代码如下

 case TOPLEFT://箭头朝左上

 {

 ui->horizontalLayout->addSpacerItem(new QSpacerItem(size().width() / , 

 , QSizePolicy::Maximum, QSizePolicy::Minimum));

 ui->horizontalLayout->addWidget(_p->messageWidget);//消息显示窗口

 ui->horizontalLayout->setStretch(, );//设置空格和窗口长度比例

 ui->horizontalLayout->setStretch(, );

 ui->verticalLayout->insertSpacerItem(, new QSpacerItem(, size().height() / 

 , QSizePolicy::Minimum, QSizePolicy::Maximum));

 ui->verticalLayout->setStretch(, );

 ui->verticalLayout->setStretch(, );

 }

 break;

 case BOTTOMLEFT://箭头朝左下

 {

 ui->horizontalLayout->addSpacerItem(new QSpacerItem(size().width() / , 

 , QSizePolicy::Maximum, QSizePolicy::Minimum));

 ui->horizontalLayout->addWidget(_p->messageWidget);

 ui->horizontalLayout->setStretch(, );

 ui->horizontalLayout->setStretch(, );

 ui->verticalLayout->addSpacerItem(new QSpacerItem(, size().height() / 

 , QSizePolicy::Minimum, QSizePolicy::Maximum));

 ui->verticalLayout->setStretch(, );

 ui->verticalLayout->setStretch(, );

 }

 break;

 case BOTTOMRIGHT://箭头朝 右下

 {

 ui->horizontalLayout->addWidget(_p->messageWidget);

 ui->horizontalLayout->addSpacerItem(new QSpacerItem(, 

 , QSizePolicy::Expanding, QSizePolicy::Minimum));

 ui->horizontalLayout->setStretch(, );

 ui->horizontalLayout->setStretch(, );

 ui->verticalLayout->addSpacerItem(new QSpacerItem(, 

 , QSizePolicy::Minimum, QSizePolicy::Expanding));

 ui->verticalLayout->setStretch(, );

 ui->verticalLayout->setStretch(, );

 }

 break;

 case TOPRIGHT://箭头朝右上

 {

 ui->horizontalLayout->addWidget(_p->messageWidget); 

 ui->horizontalLayout->addSpacerItem(new QSpacerItem(, 

 , QSizePolicy::Expanding, QSizePolicy::Minimum));

 ui->horizontalLayout->setStretch(, );

 ui->horizontalLayout->setStretch(, );

 ui->verticalLayout->insertSpacerItem(, new QSpacerItem(, 

 , QSizePolicy::Minimum, QSizePolicy::Expanding));

 ui->verticalLayout->setStretch(, );

 ui->verticalLayout->setStretch(, );

 }

 break;

整个窗口背景色透明后需要自己绘制窗口颜色,长款北京形状创建代码如下

 QPainterPath rectPath, triPath;

 switch (posStyle)

 {

 case :

 {

  rectPath.addRoundRect(QRect(size.width() / 

  , size.height() / 

  , size.width() /  * 

  , size.height() / )

  , );

  triPath.moveTo(, );

  triPath.lineTo(size.width() / , size.height() / );

  triPath.lineTo(size.width() /  * , size.height() / );

  triPath.lineTo(, );

 }

 break;

 case :

 {

  rectPath.addRoundRect(QRect(

  , size.height() / 

  , size.width() /  * 

  , size.height() / )

  , );

  triPath.moveTo(size.width(), );

  triPath.lineTo(size.width() /  * , size.height() / );

  triPath.lineTo(size.width() /  * , size.height() / );

  triPath.lineTo(size.width(), );

 }

 break;

 case :

 {

  rectPath.addRoundRect(QRect(

  , 

  , size.width() /  * 

  , size.height() / )

  , );

  triPath.moveTo(size.width(), size.height());

  triPath.lineTo(size.width() /  * , size.height() / );

  triPath.lineTo(size.width() /  * , size.height() / );

  triPath.lineTo(size.width(), size.height());

 }

 break;

 case :

 {

  rectPath.addRoundRect(QRect(size.width() / 

  , 

  , size.width() /  * 

  , size.height() / )

  , );

  triPath.moveTo(, size.height());

  triPath.lineTo(size.width() / , size.height() / );

  triPath.lineTo(size.width() /  * , size.height() / );

  triPath.lineTo(, size.height());

 }

 break;

 }

 rectPath.addPath(triPath);    //添加子闭合路径

 return rectPath;

如此创建的提示窗口,在使用过程中需要用户根据箭头的指向 自己去移动窗口​,paintEvent函数没有变化

================================================​

前边介绍的这两种不规则图形的绘制都是直接绘制在窗口上的,接下来我再介绍一种绘制不规则图形的方式​,只做大概讲述,具体实现代码我就不做过多的讲解 了,这种方式的原理就是贴图,我们把想要绘制的不规则图形先绘制到图片上,然后对图片做各种处理,比如旋转、镜像、平移等操作,然后在把图片绘制到窗口 上,这样做的好处是,这个不规则的形状可以随意变化,而不需要更改很多的代码。下面我写一下这种方式的伪代码

void 窗口重回函数()

{

根据QImage构造QPainter对象或者指针

构造如图1所示的不规则QPainterPath路径

使用绘图对象把该路径绘制到QImage上​

使用绘图对象把QImage绘制到窗口上​

}​

QPainterPath 不规则提示框(二)的更多相关文章

  1. QPainterPath 不规则提示框

    currentPosition()是最后一次绘制后的“结束点”(或初始点),使用moveTo()移动currentPosition()而不会添加任何元素. QPainterPath ​合并: 1.方法 ...

  2. android标题栏上面弹出提示框(二) PopupWindow实现,带动画效果

    需求:上次用TextView写了一个从标题栏下面弹出的提示框.android标题栏下面弹出提示框(一) TextView实现,带动画效果,  总在找事情做的产品经理又提出了奇葩的需求.之前在通知栏显示 ...

  3. UWP中的消息提示框(二)

    在UWP中的消息提示框(一)中介绍了一些常见的需要用户主动去干涉的一些消息提示框,接下来打算聊聊不需要用户主动去干涉的一些消息提示框.效果就是像双击退出的那种提示框. 先说说比较简单的吧,通过系统To ...

  4. android标题栏下面弹出提示框(一) TextView实现,带动画效果

    产品经理用的是ios手机,于是android就走上了模仿的道路.做这个东西也走了一些弯路,写一篇博客放在这里,以后自己也可用参考,也方便别人学习. 弯路: 1.刚开始本来用PopupWindow去实现 ...

  5. UWP中的消息提示框(一)

    不管什么平台,应用内难免会出现一些消息提示框,下面就来聊聊我在UWP里用到的消息提示框. 弹窗也可按是否需要用户操作促发一些逻辑进行分为两大类. 不需要用户干涉的一类: MessageDialog:操 ...

  6. 第三方框架MBProgressHUD-----实现各种提示框

    程序运行显示如下 : 点击按钮实现对应的提示框: 这里只截取了其中一张图,有兴趣的可以自己运行程序,查看其他的几种提示框哟!!! 第三方框架MBProgressHUD的下载地址:https://git ...

  7. HTML5 微信二维码提示框

    这是一个js的小案例,主要效果是显示一个微信二维码的提示框,非常简单实用. 源码如下: JS部分 <script src="js/jquery-1.8.3.min.js"&g ...

  8. (二)easyUI之消息提示框

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  9. 使用纯CSS实现带箭头的提示框

    爱编程爱分享,原创文章,转载请注明出处,谢谢!http://www.cnblogs.com/fozero/p/6187323.html 1.全部代码 <!DOCTYPE html> < ...

随机推荐

  1. junit+mock+spring-test构建后台单元测试

    from:从0开始,构建前后端分离应用 1. 一些基本概念 1.1 为什么要进行单元测试?我自己的理解是 1.能够快速发现问题.避免衍生BUG的出现     在对一些现有代码进行修改时,或者修改现有B ...

  2. 解决 Scrapy-Redis 空跑问题,链接跑完后自动关闭爬虫

    Scrapy-Redis 空跑问题,redis_key链接跑完后,自动关闭爬虫 问题:scrapy-redis框架中,reids存储的xxx:requests已经爬取完毕,但程序仍然一直运行,如何自动 ...

  3. Python3.6安装报错 configure: error: no acceptable C compiler found in $PATH

    安装python的时候出现如下的错误: [root@master ~]#./configure --prefix=/usr/local/python3.6 checking build system ...

  4. 由一条sql语句想到的子查询优化

    摘要:相信大家都使用过子查询,因为使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的SQL操作,比较灵活,我也喜欢用,可最近因为一条包含子查询的select count(*)语句导致点开管理系 ...

  5. bzoj5249 [2018多省省队联测]IIIDX

    转化一下问题变成给定一棵树,一个序列,求父亲的权值小于子树的最大方案. 直接贪心会在有重复权值时出现错误,我们考虑用线段树优化贪心. 将序列从小到大排序,线段树上每个点记录他和他右边当前还可用的权值, ...

  6. BZOJ_2142_礼物_扩展lucas+组合数取模+CRT

    BZOJ_2142_礼物_扩展lucas+组合数取模 Description 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同 ...

  7. 我的新纪元Day01

    在我刚刚开通博客园后,想了好久.不知道第一次随笔该写点什么,想写些自己学到的知识,但技术上还是菜鸟的我完全不知道我能向别人分享什么,想到这里有些沮丧. 但万事开头难,只要我入了门,广阔的编程语言的世界 ...

  8. python 模块之lxml 防xss攻击

    Use lxml.html.clean! It's VERY easy! from lxml.html.clean import clean_html print clean_html(html) S ...

  9. TensorFlow之DNN(一):构建“裸机版”全连接神经网络

    博客断更了一周,干啥去了?想做个聊天机器人出来,去看教程了,然后大受打击,哭着回来补TensorFlow和自然语言处理的基础了.本来如意算盘打得挺响,作为一个初学者,直接看项目(不是指MINIST手写 ...

  10. c#位运算基本概念与计算过程

    前言 一些非常基础的东西,在实际工作中没有用到.很少用到.一旦遇到,又不知所云.最近遇到一个问题,把一个int16(short) .两个bool变量整合成一个int32(int),当听到这个要求时,我 ...