QT 范例阅读:Vector Deformation

效果图:

主要代码:

        

实现放大镜效果QPainter painter;//两种方式if (1) {m_lens_image = QImage(bounds.size(), QImage::Format_ARGB32_Premultiplied);m_lens_image.fill(0);painter.begin(&m_lens_image);} else {m_lens_pixmap = QPixmap(bounds.size());m_lens_pixmap.fill(Qt::transparent);painter.begin(&m_lens_pixmap); //将pixmap 当做绘图设备}//使用渐变的方式画圆 QRadialGradient gr(rad, rad, rad, 3 * rad / 5, 3 * rad / 5);gr.setColorAt(0.0, QColor(255, 255, 255, 191));gr.setColorAt(0.2, QColor(255, 255, 240, 191));gr.setColorAt(0.9, QColor(150, 150, 200, 63));gr.setColorAt(0.95, QColor(0, 0, 0, 127));gr.setColorAt(1, QColor(0, 0, 0, 0));painter.setRenderHint(QPainter::HighQualityAntialiasing);painter.setBrush(gr);painter.setPen(Qt::NoPen);painter.drawEllipse(0, 0, bounds.width(), bounds.height());
    //初始化文字路径QFontMetrics fm(f);m_paths.clear();  //路径 QVector<QPainterPath>m_pathBounds = QRect(); //整串文字大小边框QPointF advance(0, 0); //文字起始点bool do_quick = true;for (int i=0; i<text.size(); ++i) {if (text.at(i).unicode() >= 0x4ff && text.at(i).unicode() <= 0x1e00) {do_quick = false;break;}}if (do_quick) {for (int i=0; i<text.size(); ++i) {QPainterPath path;path.addText(advance, f, text.mid(i, 1)); //添加文字路径m_pathBounds |= path.boundingRect();m_paths << path;advance += QPointF(fm.horizontalAdvance(text.mid(i, 1)), 0);}} else {QPainterPath path;path.addText(advance, f, text);m_pathBounds |= path.boundingRect();m_paths << path;}
//放大镜内的文字变形
QPainterPath MainWindow::lensDeform(const QPainterPath &source, const QPointF &offset)
{QPainterPath path;path.addPath(source);  //传进来的就是m_paths[i]qreal flip = 100 / qreal(100);for (int i=0; i<path.elementCount(); ++i) {  const QPainterPath::Element &e = path.elementAt(i);  qreal x = e.x + offset.x();qreal y = e.y + offset.y();qreal dx = x - m_pos.x();qreal dy = y - m_pos.y();qreal len = m_radius - qSqrt(dx * dx + dy * dy);//判断在不在圆内,在则修改路径各个点的位置if (len > 0) {path.setElementPositionAt(i,x + flip * dx * len / m_radius,y + flip * dy * len / m_radius);} else {path.setElementPositionAt(i, x, y);}}return path;
}

绘图更新:

        可以只更新 特定区域 ;如 update(rectBefore | rectAfter);  //参数是两个矩形

         paintEvent(QPaintEvent *e)  中 可以使用 e->rect(); 获取到要刷新的区域

 

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/650112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云手机哪一款好用?

随着海外市场的不断发展&#xff0c;云手机市场也呈现蓬勃的态势&#xff0c;众多云设备软件纷纷涌现。企业在选择云手机软件时&#xff0c;如何找到性能卓越的软件成为一项关键任务。在众多选择中&#xff0c;OgPhone云手机凭借其卓越的性能和独特功能脱颖而出。以下是OgPhone…

C#在图片上输出文字和保存

winform&#xff0c;图片控件&#xff0c;加载一个图片&#xff0c;在图片上输出文字&#xff1b; 输出文字的代码如下&#xff1b; private void pictureBox1_Paint(object sender, PaintEventArgs e){Graphics g1 e.Graphics;g1.DrawString("测试", this.Font, B…

搞定App关键词和评论

从关键词优化的三大基本概念走起&#xff01; 关联性 优化师一般如何选择关联性高的关键词呢&#xff1f; 主要思路如下&#xff1a;品牌词-关联词-竞品词-竞品关键词&#xff0c;优先级从前到后依次降低&#xff0c;通过ASO优化工具筛选出合适的关键词。做ASO有一个好处就是…

大型语言模型基础知识的可视化指南

直观分解复杂人工智能概念的工具和文章汇总 如今&#xff0c;LLM&#xff08;大型语言模型的缩写&#xff09;在全世界都很流行。没有一天不在宣布新的语言模型&#xff0c;这加剧了人们对错过人工智能领域的恐惧。然而&#xff0c;许多人仍在为 LLM 的基本概念而苦苦挣扎&…

8.16单调递增的数字(LC738-M)

算法&#xff1a; 拿一个两位的数字来举例。 例如&#xff1a;98&#xff0c;一旦出现strNum[i - 1] > strNum[i]的情况&#xff08;非单调递增&#xff09;&#xff0c;首先想让strNum[i - 1]--&#xff0c;然后strNum[i]给为9&#xff0c;这样这个整数就是89&#xff0c…

《动手学深度学习(PyTorch版)》笔记4.1

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过。…

tf卡被格式化怎么恢复里面的数据?恢复指南在此

在日常生活中&#xff0c;我们经常使用TF卡来存储各种数据&#xff0c;如照片、视频、文档等。然而&#xff0c;有时候我们会误将TF卡格式化&#xff0c;导致其中的数据丢失。为了挽救这些宝贵的数据&#xff0c;我们需要采取一些措施来进行恢复。本文将为你介绍如何恢复TF卡中…

华为二层交换机与防火墙配置上网示例

二层交换机与防火墙对接上网配置示例 组网图形 图1 二层交换机与防火墙对接上网组网图 二层交换机简介配置注意事项组网需求配置思路操作步骤配置文件相关信息 二层交换机简介 二层交换机指的是仅能够进行二层转发&#xff0c;不能进行三层转发的交换机。也就是说仅支持二层…

sklearn 学习-混淆矩阵 Confusion matrix

混淆矩阵Confusion matrix&#xff1a;也称为误差矩阵&#xff0c;通过计算得出矩阵的结果用来表示分类器的精度。其每一列代表预测值&#xff0c;每一行代表的是实际的类别。 from sklearn.metrics import confusion_matrixy_true [2, 0, 2, 2, 0, 1] y_pred [0, 0, 2, 2, 0…

Executors工具类

concurrent包提供了Executors工具类&#xff0c;jdk基于Executors提供了很多种线程池。 public class Executors {/*** Creates a thread pool that reuses a fixed number of threads*/public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPo…

《WebKit技术内幕》学习之十五(2):Web前端的未来

2 嵌入式应用模式 2.1 嵌入式模式 读者可能会奇怪本章重点表达的是Web应用和Web运行平台&#xff0c;为什么会介绍嵌入式模式&#xff08;Embedded Mode&#xff09;呢&#xff1f;这是因为很多Web运行平台是基于嵌入式模式的接口开发出来的&#xff0c;所以这里先解释一下什…

npm create vue3项目特别慢

问题&#xff1a;Vue CLI v5.0.8在配置了淘宝镜像的情况下&#xff0c;创建项目报Failed to check for updates&#xff0c;还特别慢&#xff0c;等了好久都创建不好 查看 npm config get registry更换npm镜像 npm config set registryhttps://registry.npmmirror.com这样创建…

电脑文件pdf怎么转换成word?30秒教你轻松转换

现在我们在工作和学习中经常接触到的文件类型一种是word文件&#xff0c;另一种就是pdf文件啦&#xff0c;这两种文件各有各的有点&#xff0c;适用的使用场景也不太一样&#xff0c;但是难免遇到需要把pdf转word的情况&#xff0c;那么pdf怎么转word呢&#xff1f;除了下载安装…

设计模式—行为型模式之责任链模式

设计模式—行为型模式之责任链模式 责任链&#xff08;Chain of Responsibility&#xff09;模式&#xff1a;为了避免请求发送者与多个请求处理者耦合在一起&#xff0c;于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链&#xff1b;当有请求发生时&am…

华清远见作业第三十二天——C++(第一天)

思维导图&#xff1a; 提示并输入一个字符串&#xff0c;统计字符中大写、小写个数、空格个数以及其他字符个数要求使用C风格完成。 代码&#xff1a; #include <iostream> #include<array> using namespace std;int main() {string str;cout << "请输…

5G时代下的融合CDN新风口

近年来&#xff0c;随着网络技术的飞速发展&#xff0c;互联网流量视频化的趋势日益明显&#xff0c;视频应用使互联网的可扩展性、可演进性、服务质量和网络安全面临诸多挑战。为克服传统IP网络在服务视频应用当中的不足&#xff0c;内容分发网络CDN被提出&#xff0c;并迅速成…

stm32中的SDIO

SDIO-SD卡 文章目录 SDIO-SD卡SD卡结构物理结构SD卡寄存器列表 SDIO总线SDIO总线拓扑SDIO总线SDIO总线协议常规数据传输宽位数据包 命令命令格式命令的类型命令集 SD卡的操作模式数据传输模式 STM32 的 SDIO 功能框图控制单元命令路径CPSM 状态机描述图数据路径数据 FIFO SDIO结…

SQL注入实战:二阶注入

一、二阶注入的原理 1、二阶注入也称为SOL二次注入。 2、二次注入漏洞是一种在Web应用程序中广泛存在的安全漏洞形式:相对于一次注入漏洞而言&#xff0c;二次注入漏洞更难以被发现&#xff0c;但是它却具有与一次注入攻击漏洞相同的攻击威力。 3、简单的说&#xff0c;二次…

3D应用开发工具HOOPS引领数字化工厂浪潮:制造业转型的关键角色!

随着科技的迅猛发展&#xff0c;制造业正经历着数字化转型的浪潮。在这一变革的前沿&#xff0c;Tech Soft 3D 的 HOOPS技术正扮演着关键的角色。 本文将深入研究HOOPS技术如何在数字化工作流程中发挥作用&#xff0c;以及它是如何引领制造业朝着更高效、智能的未来迈进的。 …

NeRF:神经辐射场复杂场景的新视图合成技术

NeRF&#xff1a;神经辐射场复杂场景的新视图合成技术 NeRF&#xff1a;神经辐射场复杂场景的新视图合成技术项目背景与意义如何运行&#xff1f;快速开始更多数据集 预训练模型方法与实现结语服务 NeRF&#xff1a;神经辐射场复杂场景的新视图合成技术 在计算机视觉领域&…