svg图片构造QGraphicsSvgItem对象耗时很长的问题解决

qt svg文件的读取和保存 用于将SVG文件的内容绘制到绘图设备上,其是打开svg将其渲染到QPixmap等上面。用于创建SVG图形的绘制设备,主要用于保存的时候使用,注意保存到时候直接使用局部变量即可,使用全局变量其没有析构反倒不会保存。QGraphicsItem,可用于呈现SVG文件的内容,可以细化拆分Svg的元素。用于显示可缩放矢量图形(SVG)文件内容的小部件,直接加载svg文件,即可显示。Qt提供了用于在小部件和其他绘制设备中呈现和显示SVG图形的类。Qt SVG提供了用于呈现SVG文件的类。 阅读详情

目录

1. 问题的提出

2. 问题解决


1. 问题的提出

      今天通过一张像素为141 * 214,大小为426KB的svg格式的图片构造QGraphicsSvgItem对象,再通过Qt的Graphics View Framework框架,将QGraphicsSvgItem对象显示到场景视图上,代码如下:

#include <QElapsedTimer>
#include <QGraphicsSvgItem>
......   // 其它头文件略

......   // 其它代码略

auto pBatteryChargeGraphicsScene = new QGraphicsScene(this);
ui->graphicsView->setScene(pBatteryChargeGraphicsScene);
   
QElapsedTimer timer;
timer.start();

auto pPeiDianGuiComponent = new QGraphicsSvgItem(QStringLiteral(":/uavGuarantee/image/batteryChargeShelters/peidiangui.svg"));

qDebug() << "The slow operation took" << timer.elapsed() << "milliseconds";

pPeiDianGuiComponent->setPos(100, 100);
pBatteryChargeGraphicsScene->addItem(pPeiDianGuiComponent);


......   // 其它代码略
其中ui->graphicsView为QGraphicsView类对象,第13行竟然耗时6376毫秒,如下:

最要命的是程序一起来就需要加载QGraphicsSvgItem对象上百个,那就更慢了,十分影响用户体验。

2. 问题解决

用Adobe Photoshop打开svg图片,选择“文件->导出->导出为...”,如下:

在右侧“重新采样”下拉框中选择“两次线性”,然后单击右下角“导出”按钮,此时原来426KB的svg图片变为了10KB,然后改为加载此10KB的svg图片,效率提升很多,耗时如下:

《QT从基础到进阶·二十二》QGraphicsView显示大量图形项item导致界面卡顿的解决办法 在Item调用方式3或者直接在item构造中设置方式3能有效避免界面卡顿问题,如果图形项涉及大量的旋转,缩放,剪切,则方式3效果会和方式1差不多,基本没啥效果,界面依旧卡顿,这时就应该用方式4。有时候因业务需要,paint函数在界面上绘制了成百上千个图形项Items,导致操作界面的时候有明显的卡顿感,下文会提供一种比较好的解决办法,先来了解下QGraphicsItem的缓存方式。请注意,在某些情况下使用缓存可能会导致问题。例如,如果您的项的位置或大小经常更改,则需要清除该项的缓存以确保正确性。 阅读详情

相关推荐

Qt图形视图框架--图元总结

所有自定义图元都必须继承图元基类QGraphicsItem或其子类;自定义图元:添加枚举标识、重新三个虚函数1、标识图元每个图元都有一个枚举标识,例如路径图元的标识为:2在场景操作中当检测Type值为2时,就可以确定这个图元是一个路径图元;查看QGraphicsItem接口,可以发现Qt给开发者预留了标识:开发者使用标识UserTypepublic :enum {public :enum {}2、重写虚函数type()函数是用来返回图元类型的;

贝勒里恩的博客 2163

图形视图(15):【类】QGraphicsSvgItem [官翻]

文章目录详述属性elementId : QStringmaximumCacheSize : QSize公共函数构造函数属性相关QSvgRenderer重写的公共函数演示代码 QGraphicsSvgItem 类 QGraphicsSvgItem类是一个QGraphicsItem,可用于呈现SVG文件的内容。 Header: #include < QGraphicsSvgItem > qmake: QT += widgets Inherits: QGraphicsObject

读书笔记 3177

QT实现QGraphicsView绘图 重写QGraphicsSvgItem类实现边框动画

在了解学习WPS的流程图的时候,发现它这个选择图元有个动态边框效果,而且连接线还会根据线生成点从头移动到尾的动画。通过研究上面的SVG可以发现,边框的动画效果实际是stroke-dashoffset 属性的变动,也可以通过。绘制图元时,只要使用 QTimer 周期性将画笔的DashOffset值来回的修改就可以了,QPropertyAnimation类 变化的差值是线性的,看不出边框虚线效果。在QML中实现这种动画属性很简单,现成的动画属性,但是在。即使我把QT版本升级成。在QT中SVG的动画属性只支持。

... 1233

QGraphicsSvgItem

概述 作为一个可以使用svg文件的QGraphicsItem ,添加于QGraphicsScene,可使用QGraphicsView进行查看。 - 特点: 1. 提供SVG的渲染方式,可以使用SVG文件路劲进行构建对象; 2. 提供setElementId()渲染部分SVG文件,调用时,只用其设定元素和其子元素才会被渲染,对于大文件中为小元素进行渲染 3. setSize()设置大小 ...

uriel_chiang的博客 5309

将SVG矢量图显示在Qt的QGraphicsView视图框架上

将SVG矢量图显示在Qt的QGraphicsView视图框架上,具有通过QDomDocument、QDomElement、QDomNode、QDomNameNodeMap等对象来解析svg并修改svg来实现矢量图的部分内容缩放,部分内容不缩放的功能。

Clang Static Analyzer 使用教程:本地 + CMake + GitHub Actions 自动静态分析实战

本文介绍了ClangStaticAnalyzer静态代码分析工具的使用方法。该工具基于Clang/LLVM,可检测C/C++代码中的内存泄漏、空指针等常见错误。主要内容包括:安装指南(Ubuntu/macOS/Windows)、命令行使用方法、CMake项目集成方案、GitHub Actions自动化分析配置,以及HTML报告生成与查看。文章还提供了官方资源链接,帮助开发者系统掌握从本地调试到持续集成的完整静态分析工作流,提升代码质量保障能力。适用于需要在开发过程中实施静态分析的C/C++项目。

u014358031的博客 2157

Qt之SVG:Qt简单使用SVG的介绍

文章目录一、SVG 是什么?二、Qt 怎么显示和创建SVG2.1 使用QGraphicsSvgItem 显示2.2 使用 QSvgWidget 显示2.3 使用 QSvgRenderer 渲染其他绘制设备2.4 使用QSvgGenerator 创建SVG 文件三、总结 一、SVG 是什么? 可伸缩矢量图形(SVG)是一种基于XML的语言,用于描述二维矢量图形。 如下面这个简单表示圆的SVG文件 <?xml version="1.0" standalone="no"?> <!DOCTYPE

读书笔记 2万+

GD32 TIMER0 PWM输出死活没波形?别忘了这个关键配置(附完整代码)

本文详细解析了GD32 TIMER0 PWM输出无波形的常见问题,特别强调了高级定时器特有的主输出使能配置。通过完整的代码示例和调试技巧,帮助开发者快速解决PWM输出问题,适用于无刷电机控制等嵌入式应用场景。

weixin_30906185的博客 397

使用QGraphicsItem来加载svg实现移动放大缩小

继承QGraphicsView 重写滚轮事件可以实现视图缩放。使用下面的方法可以实现QGraphicsItem的拖动功能。

bureau123的博客 650

机械臂标准DH建模及正运动学分析(以IRB4600型工业机械臂为例)

对于工业机械臂而言,运动学是不考虑力学特性的情况下对机械臂的几何参数与其位置、速度、加速度等运动特性的关系研究。DH建模是运动学的基础,全称为Denavit-Hartenberg建模方法,是一种广泛应用于机器人运动学中的建模技术。该方法通过在每个连杆上建立坐标系,并利用齐次坐标变换来实现连杆之间的坐标转换。通过依次变换,可以推导出末端执行器相对于基坐标系的位姿,从而建立机器人的运动学方程。以IRB4600型六自由度工业机械臂为例,选择标准DH建模方法,建立其正运动学模型。

chen_mp的博客 1万+

保姆级教程:用PyTorch从零实现SDE扩散模型(附完整代码与MNIST实战)

本文提供了一份详细的PyTorch教程,指导读者从零开始实现SDE扩散模型,并附有完整的代码示例和MNIST数据集实战。通过解释随机微分方程(SDE)的核心概念、模型架构设计、训练流程实现以及采样生成过程,帮助开发者掌握扩散模型的构建与应用。

weixin_28677005的博客 265

Qt 之QGraphicsView类、QGraphicsScene类、QGraphicsItem类、QDataWidgetMapper类的用法示例

示例概述 本示例用到model\view模型:model类是用QSqlRelationalTableModel,view相当于由三个小部件组成,分别是label、comboBox、texEdit,把数据模型中的数据通过QDataWidgetMapper类绑定到上面三个小部件上。 本示例还用到图形视图类QGraphicsView,图形场景场QGraphicsScene、图形项目类QGraphicsItem之前的关系及用法,场景类QGraphicsScene对象必须设置到QGraphicsView对象里

mabiao0825的博客 2353

瑞芯微RV1126平台人脸识别模型转换实战:从ONNX到RKNN的完整流程

本文详细介绍了在瑞芯微RV1126平台上,将人脸识别模型从ONNX格式转换为RKNN格式的完整实战流程。内容涵盖模型结构分析、RKNN-Toolkit环境搭建、量化数据集准备、核心转换脚本编写与参数解析,以及在设备端的部署测试与性能调优,旨在帮助嵌入式AI开发者高效完成模型转化,提升边缘设备上的人脸识别应用部署效率。

o5p6q的博客 570

Qt6.0下使用QGraphicsSvgItem

在Qt5.14下用得没问题的QGraphicsSvgItem,在Qt6.0.0下编译不过: fatal error: QGraphicsSvgItem: No such file or directory #include <QGraphicsSvgItem> 原以为Qt6取消了这个class,找到Qt GUI C++ Classes,发现QGraphicsSvgItem还在,不用大改代码了。 进入Qt6.0.0的QGraphicsSvgItem Class页面, Qt5.15中的

1613

Ansys-结构动力学分析-圆柱斜齿轮模态分析学习心得

模态分析的步骤基本一直,不同点在于选择什么单元类型,模型,节点约束等 圆柱斜齿轮模态分析的难点在于圆柱斜齿轮的模型建立,和所要约束的节点的选择。 用命令流方法建立齿轮模型效率较高,当然,在ansys里建立复杂的模型实在不敢恭维,对于自下而上建模,需要知道每个关键点的坐标位置。下图是创建圆柱斜齿轮模型的命令流方式。 模型不同使用的数据也就不同了。 对于施加约束的问题这就必须要熟悉select e...

weixin_45385183的博客 1831

任务混部最少服务器数量计算问题

这里的并行度指的是该任务运行时会占用的服务器数量。要注意的是,一个服务器在每个时刻可以被任意任务使用,但同一时刻最多只能被一个任务占用,并且任务运行结束后会立即释放服务器(结束时刻不占用)。最后,我们从字典中找出服务器数量的最大值,这个最大值就是完成这批任务混部最少需要的服务器数量。对于每个任务,我们会遍历其对应的时间区间,将该任务的并行度累加到对应时刻的服务器数量上。任务混部的目标是让这批任务由同一批服务器承载运行,你需要计算完成这批任务混部最少需要多少服务器,以此来最大化控制资源成本。

m0_62153576的博客 106

QT使用QGraphics绘制大量的Item出现越来越卡顿,最终卡死程序问题解决

使用pLineItem->setCacheMode(QGraphicsItem::ItemCoordinateCache)也不卡顿了,但是直线较为模糊。最近开始使用QT写算法,并且是高性能的,当频繁刷新Item的时候,出现越来越慢的情况,最终软件会完全卡死,找了一圈都没有太多办法。使用了m_pScene->clear();,清除了Scence 现象没有任何变化。由于 不断使用以下代码来绘制直线。包括绘制点也用这个函数。导致Item很多之后卡死。效果较好,绘制的直线清晰。

狼牙道长的博客 3570

人工蜂群优化算法(ABC)详解:原理、实现与应用

人工蜂群算法(Artificial Bee Colony, ABC)是Karaboga于2005年提出的一种群体智能优化算法,其灵感来源于蜜蜂群体在自然界中高效的采蜜行为。该算法通过模拟雇佣蜂、观察蜂和侦察蜂三种角色的分工协作来寻找最优解。在ABC算法中,每个潜在的解决方案被视为一个“食物源”,其质量由适应度函数评估。雇佣蜂负责在已知优质食物源附近进行局部开采;观察蜂根据雇佣蜂分享的信息,以一定概率选择并跟进优质食物源;侦察蜂则随机探索新区域,防止种群陷入局部最优。

qq_42212808的博客 393

Qt graphicsview 实现大量线阵、列数据Item实时刷新的方案1(亲测)

qt graphicsview实现线阵数据大量Item实时刷新扫描。advance函数,线阵相机。

weixin_42367017的博客 1516

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

如何优化 SVG 文件以提升加载速度和性能

【代码】如何优化 SVG 文件以提升加载速度和性能。

wsl3465205046的博客 2142

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

QGraphicsItem释放内存——QGraphicsRectItem

最近需要完成一个项目,其中一个小功能就是new出来的QGraphicsRectItem内存无法释放,我的每一轮QGraphicsRectItem都会变化,但是如果不停的new QGraphicsRectItem就会产生内存堆积Graphics View包含三个类的使用;场景类(QGraphicsScene):该类提供绘图场景(Scene),场景是不可见的,是一个抽象的管理图形项的容器,可向场景中添加图形项,获取场景中的某个图形项等视图类(QGraphicsView):该类提供绘图的视图(View)组件,用于

qq_51377150的博客 1577

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

上一篇: CMake生成osg的FFMPEG插件及Windows下不生成VS工程问题解决
下一篇: 通过setPos设置QGraphicsItem在场景中的坐标位置不起作用的问题解决
荆楚闲人
博客等级 码龄20年 3万+粉丝 473原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值