Qt中标绘功能的实现方法对比

使用Qt开发桌面程序,经常会有标绘的需求,一般有以下几点:

  • 新建:圆、矩形、椭圆、文字标注,插入图像等;
  • 编辑:指对已标绘内容的属性编辑修改功能;
  • 删除:指对已标绘内容的删除功能;
  • 浏览:指提供对已标绘内容的平移、放大缩小等浏览操作。

包含标绘功能的最典型的应用是地图标绘系统。一个简易的地图标绘系统demo如下图所示:
地图标绘系统demo

Qt中,标绘功能有不同的实现方式,通常有以下几种。

基于QPainter的面向过程的实现方式

此种方式下,实现一个标绘系统,通常需要创建一个QWidget子类,在子类中实现鼠标、键盘等事件响应以及界面刷新显示。

具体的做法为:

  • 新建QWidget子类
  • 根据需求,选择重载鼠标移动mouseMoveEvent、鼠标点击mousePressEvent、鼠标释放mouseReleaseEvent等鼠标事件响应函数,选择重载按键按下keyPressEvent、按键释放keyReleaseEvent等按键事件响应函数。
  • 重载paintEvent界面刷新响应函数,根据输入实时绘制图元,刷新界面,响应用户的操作,实现流畅的交互过程。

此种实现方式最大的优点是简洁,仅仅新建一个类以及重载几个必要的函数即可实现简单的标绘功能。但是它的缺点也是显而易见的,主要有以下几点:

  • 维护问题。当标绘元素种类增多时,所有的标绘元素的实现代码都糅合在一个QWidget子类中,这会导致此类逐渐难以维护。如果代码结构不清晰,容易出现bug。
  • 功能问题。一些高级功能特性,例如坐标计算/转换、仿射变换、层叠特性、裁剪优化、图元命中/索引算法,需要自己来实现,实现难度大,工作量也很大。
  • 性能问题。如果对性能要求较高,就需要做大量优化,自己实现难度大。

所以基于QPainter的面向过程的实现方式比较适用于构建小规模、功能简易的标绘系统。
为了克服以上缺点,可以尝试采用基于QGraphicsView的面向对象的实现方式。

基于QGraphicsView的面向对象的实现方式

基于QGraphicsView的面向对象的实现方式,是指使用Qt库内置的QGraphicsView模块构建标绘系统的方法。文章开始部分介绍的地图标绘系统demo就是基于QGraphicsView实现的。

QGraphicsView库对标绘业务进行了建模,抽象出了场景画布及图元类,并提供了常用的高级特性。采用面向对象的方式,可以将不同部分的业务代码分散到不同的类中,并通过对象间通信完成协作,从而构建出结构清晰,易于维护的系统。

基于QGraphicsView,使用者可以把更多的精力放在业务实现上。在构建比较复杂的标绘系统时,使用QGraphicsView是首选方案。

QGraphicsView具体在性能、功能方面的特点,在官方文档中有详细描述。除文档外,官方还提供了“40000 Chips”、“Diagram Scene Example”等完整可用的demo供学习。

QGraphicsView相对于QPainter的区别在于,它需要一定的学习成本,对面向对象的编码能力有一定的要求。

结语

通过系统地分析,我们研究了两种标绘的实现方案。不同实现方案适用于不同的使用场景,实际使用时根据需求权衡方案即可。


本文原创首发于微信公众号“Qt未来工程师”。

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

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

相关文章

【转】PE文件结构详解--(完整版)

(一)基本概念 PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等,事实上,一个文件是否是PE文件与其扩展名无关,P…

【转】逆变与协变详解

逆变(contravariant)与协变(covariant)是C#4新增的概念,许多书籍和博客都有讲解,我觉得都没有把它们讲清楚,搞明白了它们,可以更准确地去定义泛型委托和接口,这里我尝试画…

【转】GitHub 从单机到联机:玩转 Pull Request

最近在参与一个叫 Exercism 的项目,这是一个由 GitHub 生态工程师 Katrina Owen 发起的编程练习社区,提供了超过50门语言的练习。作为用户,你仅需使用命令行工具即可下载和提交练习,提交后还可以和社区中其他学习者交流讨论。 Exe…

【转】GitHub客户端操作1--仓库相关操作github团队协作流程

1、创建仓库 点击“”,点击Create,然后填写Name为my,点击Create repository,即可创建一个my仓库 2、从本地仓库存放位置,添加test仓库到GitHub客户端 点击“”,点击Add,然后点击Browse,选择仓库存放位置&a…

【转】GitHub客户端操作2--分支操作

简单分支操作 (1)创建新分支:my分支 备注:新创建的分支:my分支里面的内容是和master分支里面的内容是完全一样的。 (2)删除my分支 (3)修改my分支【在my分支上进行项目内…

【转】GitHub客户端操作3--pull Request(拉请求)

一、参考说明 参考文章一:Github上提交代码(pullrequest) 网址: https://jingyan.baidu.com/article/358570f64dcdc2ce4724fc32.html 参考文章二:GitHub——Pull Request 网址:http://blog.csdn.net/u012325167/article/detai…

【转】GitHub上README.md教程

本文是转载文章,文章的来源:csdn博客 博主:果冻虾仁 文章: GitHub上README写法暨GFM语法解读 博文地址:https://blog.csdn.net/guodongxiaren/article/details/23690801 转载请保留原作者guodongxiaren的原文地址&…

【转】WPF单位真的与分辨率无关吗?

转载自http://www.cnblogs.com/helloj2ee/archive/2009/04/21/1440709.htm WPF从发布之日起,一直将“分辨率无关(resolution independence)”作为其亮点,声称使用WPF制作的用户界面在轻巧的Ultra-Mobile PC的屏幕上和在50英寸的电视机上都能很好地显示。…

【转】世上最简单的vue教程

一、需要了解的基本知识 node.js Node.js是一个Javascript运行环境(runtime),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。Node.js对一些特殊用例进行优化,提供替代的API,使得V8在非浏览器环境…

工程师学乐理(一)尝试理解音乐

前言 很早就接触了乐理,但是一直没有学懂,越学问题越多。个人感觉,其中很大的原因是有关教材写得看不懂,用未知的东西描述未知的东西,不知所云。前几年还买了一把吉他,买了课程,断断续续学了几…

【转】Vue.js入门教程(一)从静态页面到前后端分离开发

第一章:基础知识 我能看懂吗? 只要你现在能用htmlcssjs制作一个静态页面,相信我,你100%可以读懂这篇文章。 本文尤其适合那些想要了解前后端分离开发技术,或者刚刚脱离传统MVC开发模式的前端人员。 回想一下&#xf…

工程师学乐理(二)音阶及倾向性

前言 阅读本文前,请先阅读《写给理工科人看的乐理》。 本文主要讲音阶。在其他地方能查到的细节,我们这里就不会多说了。本文重点在于梳理音阶背后的逻辑,尝试把技术点串起来讲。 没有逻辑的东西是咱们工程师比较讨厌的,任何大自…

【转】VS工具:实时可视化树

VisuaStudio号称全宇宙最强大的IDE。在VS2015版本中,微软又给广大开发者带来了一个强大的工具:实时可视化树(Live Visual Tree,以下简称可视树)。其实树可视化工具并不是新鲜的东西,在WPF的时候就有了,只是这次微软集成…

【转】WPF 入门《常用控件》

1.GroupBox 注意: GroupBox仍然需要布局容器来放置元素。如: StackPanel面板 1 2 3 4 5 6 7 <GroupBox Header"select number?"> <StackPanel> <RadioButton>one</RadioButton> <RadioButton>two</…

【转】wpf从我炫系列1----布局控件的使用(上)

今天我来给大家讲解在学习WPF过程中使用布局控件的一些心得&#xff0c;主要给大家介绍一下一个控件的用法。希望对大家学习Wpf有所帮助. 1. StackPanel栈面板 2. WrapPanel环绕面板 3. DockPanel停靠面板 4. Grid网格 5. UniformGrid均布网…

【开源项目】EasyCmd命令图形化软件

EasyCmd 项目地址&#xff1a;https://gitee.com/showmework/EasyCmd 最新版本&#xff1a;v0.2预览版 介绍 命令行图形化。 让命令行更易于使用&#xff0c;从命令行复杂的参数及语法中解放出来。 设计思想 软件设计思想并不是构建用户界面&#xff0c;现代操作系统已经…

php在线读取pdf文件大小_PDF转WORD在线转换器哪家强?

无论是工作还是日常生活中&#xff0c;经常需要将pdf转换成word文档进行编辑&#xff0c;我想大部分人一定是和我一样&#xff0c;首先会去找度娘帮忙&#xff0c;百度一下“pdf转word”出现了很多在线转换器&#xff0c;比如大家常用的讯捷、smallpdf等&#xff0c;然后立马进…

【转】wpf从我炫系列2----布局控件的使用(下)

4. GRID控件 Grid控件可以是说是wpf中功能最强大和使用最多的控件。它有点类似于HMTL网页布局中的表格&#xff0c;可以自定义行列显示&#xff0c;并可以合并某些行和列. 使用<Grid.RowDefinitions>可以定义GRID中的行数&#xff0c; 使用<Grid.ColumnDefi…

【转】WPF从我炫系列3---内容控件的用法

今天我来给大家讲解WPF中内容控件的用法&#xff0c;在WPF中的内容控件&#xff0c;通俗的讲&#xff0c;是指具有Content属性的控件&#xff0c;在content属性里面可以嵌套放置任意其他类型的控件&#xff0c;但是Content只能接受单个元素&#xff0c;可以通过布局控件来组合放…

【转】WPF从我炫系列4---装饰控件的用法

在这一节的讲解中&#xff0c;我将为大家介绍WPF装饰控件的用法&#xff0c;主要为大家讲解一下几个控件的用法. ScrollViewer滚动条控件 Border边框控件 ViewBox自由缩放控件 1. ScrollViewer滚动条控件 大家知道在WPF中的一些布局控件中是不带滚动条的&#xff0c;如果里面…