QPainterPath 不规则提示框(二)
前一篇讲过不规则提示框,但是提示框的方向是固定的,不能达到随意变换方向的效果,本接讲述可以动态变换方向的提示框
先看效果图
如上图1所示,上一篇文章的代码可以达到类似效果
本片文章我只介绍变动部分,尽可能的做到详细吧
我先说原理,整个窗口包含两个布局器,水平布局和垂直布局,还有2个空间填充器,最后一个当然是显示消息的窗口,显示消息的窗口可以定制
整个窗口可以使用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 不规则提示框(二)的更多相关文章
- QPainterPath 不规则提示框
currentPosition()是最后一次绘制后的“结束点”(或初始点),使用moveTo()移动currentPosition()而不会添加任何元素. QPainterPath 合并: 1.方法 ...
- android标题栏上面弹出提示框(二) PopupWindow实现,带动画效果
需求:上次用TextView写了一个从标题栏下面弹出的提示框.android标题栏下面弹出提示框(一) TextView实现,带动画效果, 总在找事情做的产品经理又提出了奇葩的需求.之前在通知栏显示 ...
- UWP中的消息提示框(二)
在UWP中的消息提示框(一)中介绍了一些常见的需要用户主动去干涉的一些消息提示框,接下来打算聊聊不需要用户主动去干涉的一些消息提示框.效果就是像双击退出的那种提示框. 先说说比较简单的吧,通过系统To ...
- android标题栏下面弹出提示框(一) TextView实现,带动画效果
产品经理用的是ios手机,于是android就走上了模仿的道路.做这个东西也走了一些弯路,写一篇博客放在这里,以后自己也可用参考,也方便别人学习. 弯路: 1.刚开始本来用PopupWindow去实现 ...
- UWP中的消息提示框(一)
不管什么平台,应用内难免会出现一些消息提示框,下面就来聊聊我在UWP里用到的消息提示框. 弹窗也可按是否需要用户操作促发一些逻辑进行分为两大类. 不需要用户干涉的一类: MessageDialog:操 ...
- 第三方框架MBProgressHUD-----实现各种提示框
程序运行显示如下 : 点击按钮实现对应的提示框: 这里只截取了其中一张图,有兴趣的可以自己运行程序,查看其他的几种提示框哟!!! 第三方框架MBProgressHUD的下载地址:https://git ...
- HTML5 微信二维码提示框
这是一个js的小案例,主要效果是显示一个微信二维码的提示框,非常简单实用. 源码如下: JS部分 <script src="js/jquery-1.8.3.min.js"&g ...
- (二)easyUI之消息提示框
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- 使用纯CSS实现带箭头的提示框
爱编程爱分享,原创文章,转载请注明出处,谢谢!http://www.cnblogs.com/fozero/p/6187323.html 1.全部代码 <!DOCTYPE html> < ...
随机推荐
- centos7服务器无GUI情况下安装使用Xvfb、selenium、chrome和selenium-server
最近需要用到selenium浏览器抓取,在windows下对照chrome浏览器开发的代码,在linux服务器上换成phantomjs驱动后,却不能运行了,通过截图发现phantomjs渲染效果和ch ...
- 用spark导入数据到hbase
集群环境:一主三从,Spark为Spark On YARN模式 Spark导入hbase数据方式有多种 1.少量数据:直接调用hbase API的单条或者批量方法就可以 2.导入的数据量比较大,那就需 ...
- balance.go 源码阅读
) //10s +随机毫秒数 后 执行下面代码 for _ = range t { for _, v := range pBackendSvrs { i ...
- 【bzoj 4173】数学
Description Input 输入文件的第一行输入两个正整数 . Output 如题 Sample Input 5 6 Sample Output 240 HINT N,M<=10^15 ...
- Apache SkyWalking 为.NET Core带来开箱即用的分布式追踪和应用性能监控
在大型网站系统设计中,随着分布式架构,特别是微服务架构的流行,我们将系统解耦成更小的单元,通过不断的添加新的.小的模块或者重用已经有的模块来构建复杂的系统.随着模块的不断增多,一次请求可能会涉及到十几 ...
- css:id选择器的权重>class选择器的权重=属性选择器的权重>元素选择器
最近的项目要自己写前端了,重新学习下前端的一下基本知识. 一般在css样式表中,上面的会被下面的覆盖,如下图,文字会显示蓝色: 所以按照正常的来说,下面的css样式,测试的文字应该还是蓝色 但结果,测 ...
- vue+axios访问本地json数据踩坑点
当我们想在vue项目中模拟后台接口访问json数据时,我们发现无论如何也访问不到本地的json数据. 注意:1.在vue-cli项目中,我们静态资源只能放在static文件夹中,axios使用get请 ...
- 鸟哥的Linux私房菜笔记第四章
前言 对着<鸟哥的Linux私房菜-基础版>做了简化笔记.不想让自己知其然而不知其所然.所以写个博客让自己好好巩固一下,当然不可能把书中的内容全部写下来.在这里就简化一点把命令写下来. 让 ...
- 【JVM虚拟机】(6)---深入理解Class中访问标志、类索引、父类索引、接口索引
JVM(6)访问标志,类索引 上一篇博客讲[JVM虚拟机](5)---深入理解JVM-Class中常量池 我们知道一个class文件正常可以分为7个部分: 魔数与class文件版本 常量池 访问标志 ...
- 前端 SPA 单页应用数据统计解决方案 (ReactJS / VueJS)
前端 SPA 单页应用数据统计解决方案 (ReactJS / VueJS) 一.百度统计的代码: UV PV 统计方式可能存在问题 在 SPA 的前端项目中 数据统计,往往就是一个比较麻烦的事情,Re ...