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> < ...
随机推荐
- Redis in Python:HyperLogLog(pfadd、pfcount、pfmerge)
redis HyperLogLog 可以接受多个元素作为输入,并给出输入元素的基数估算值. 基数:集合中不同元素的数量.比如 [foo', 'bar', 'foobar', 'bar', 'test' ...
- Python并发编程之深入理解yield from语法(八)
大家好,并发编程 进入第八篇. 直到上一篇,我们终于迎来了Python并发编程中,最高级.最重要.当然也是最难的知识点--协程. 当你看到这一篇的时候,请确保你对生成器的知识,有一定的了解.当然不了解 ...
- MYSQL—— 启动MYSQL 57 报错“The service MYSQL57 failed the most recent........等”的问题解决方式!
每天开机之后,启动MYSQL Notifier就报错,第一次出现重启电脑后解决,后面的几天老是出现,重启电脑好几次都没有解决,感觉很烦人,一定要搞定这个问题找到原因,于是有了下文....... 启动M ...
- maven创建web报错Cannot read lifecycle mapping metadata for artifact org.apache.maven.plugins:maven-compiler-plugin:maven-compiler-plugin:3.5.1:runtime Cause: error in opening zip file
Cannot read lifecycle mapping metadata for artifact org.apache.maven.plugins:maven-compiler-plugin:m ...
- 用Python学分析 - 散点图
# 运用散点图对数据分布得到直观的认识 import numpy as np import matplotlib.pyplot as plt # 设计 x, y 轴 n = 10000 x = np. ...
- 阿里云大数据计算服务 - MaxCompute (原名 ODPS)
MaxCompute 是阿里EB级计算平台,经过十年磨砺,它成为阿里巴巴集团数据中台的计算核心和阿里云大数据的基础服务.去年MaxCompute 做了哪些工作,这些工作背后的原因是什么?大数据市场进入 ...
- [区块链] 密码学——椭圆曲线密码算法(ECC)
今天在学椭圆曲线密码(Elliptic Curve Cryptography,ECC)算法,自己手里缺少介绍该算法的专业书籍,故在网上查了很多博文与书籍,但是大多数博客写的真的是...你懂的...真不 ...
- ORM 开发环境之利器:MVC 中间件 FreeSql.AdminLTE
前言 这是一篇纯技术干货的分享文章,FreeSql 已经基本完成 .NETCore 最方便的 ORM 使命,我们正在筹备生态的建立,比如 ABP 中如何使用 FreeSql 的实现,需要各种各样的扩展 ...
- 深入理解令牌认证机制(token)
以前的开发模式是以MVC为主,但是随着互联网行业快速的发展逐渐的演变成了前后端分离,若项目中需要做登录的话,那么token成为前后端唯一的一个凭证. token即标志.记号的意思,在IT领域也叫作令牌 ...
- LeetCode重建二叉树系列问题总结
二叉树天然的递归特性,使得我们可以使用递归算法对二叉树进行遍历和重建.之前已经写过LeetCode二叉树的前序.中序.后序遍历(递归实现),那么本文将进行二叉树的重建,经过对比,会发现二者有着许多相似 ...