Qt — Graphics/View框架

news/2024/5/19 12:32:07/文章来源:https://blog.csdn.net/heusunduo88/article/details/130321405

文章目录

  • 前言
  • 一、Qt图形系统介绍
  • 二、Graphics/View框架


前言

Qt的Graphics/View框架被用来存放、显示二维图形元素,处理那些对图形元素进行操作的交互命令。


一、Qt图形系统介绍

Qt 应用程序的图形界面包含各种控件,比如窗口、按钮、滚动条等。所有这些控件对象都具有一个共同的基类QWidget。一个QWidget对象是构成图形界面的基本单位。它能够在屏幕上绘制自己,能够处理鼠标、键盘事件。控件所占的屏幕区域总是矩形的。在屏幕上显示多个控件时会按照一定的顺序逐个显示。我们称先被显示的控件位于“底层”,后被显示的位于“顶层”。当多个控件所占区域重叠时,顶层控件会遮挡底层控件。

我们知道,控件之间可以形成父子关系,比如对于一个对话框,其中的按钮、滚动条等为子控件,对话框为父控件。子控件常常作为父控件的数据成员出现,所以我们也称一个父控件包含一个子控件,或者一个子控件被嵌入到一个父控件中。大部分控件都作为子控件出现,没有父控件的控件被称为窗口。通常,一个窗口的四周具有边框,其顶部具有一个标题。Qt的QMainWindow以及QDialog是常用的窗口控件。父控件的尺寸较大,子控件的尺寸较小。当子控件的部分或者全部落在父控件区域之外时,只有位于父控件区域之内的部分才会被绘制。一个图形界面由多个控件层叠而成,父控件位于底层,而子控件位于顶层。Qt总会先绘制底层的控件再绘制顶层的控件,以形成层叠效果。

绘制一个几何图形需要做两方面工作。

(1)计算该图形中每个像素的坐标位置。比如在绘制一个线段时,我们往往只是给定起点、终点的坐标,绘制时就需要计算线段上任意一点的坐标。虽然理论上一个线段有无穷多个点,但是由于计算机屏幕、打印机等图形输出设备的分辨率是有限的,我们只需要计算该线段上有限个点的坐标,类QPainter负责完成此项任务。

(2)将计算出来的轨迹输出到特定设备,比如屏幕或者打印机,类QPainterDevice表示这些设备。

程序员通常使用QPainter的构造函数QPainter ( QPaintDevice * device )构造一个对象,调用该对象的图形绘制函数,即可在参数device所指的设备上绘制图形。QPainter提供了丰富的图形绘制函数,经常使用的图形绘制函数如下。drawLine(),drawPolyline()和drawArc()分别绘制直线、折线、曲线,drawRect(),drawEllipse(),drawPolygon(),drawPie()分别绘制矩形、椭圆、多边形、馅饼形。绘制前,我们可以调用setPen()设定线宽、线的颜色等参数。如果被绘制的图形是封闭的,图形内部将被填充。函数setBrush()设置填充颜色、填充模式等。为了输出文字,可以调用drawText(),而setFont()可以设置字体、字号等。

二、Graphics/View框架

Qt的Graphics/View框架被用来存放、显示二维图形元素,处理那些对图形元素进行操作的交互命令。

该框架包含3个核心类:QgraphicsItemQgraphicsSceneQGraphicsViewQGraphicsItem表示被显示的图形元素。QGraphicsScene表示囊括了所有图形元素的场景。该类只表示一个场景由哪些图形元素组成,并不负责显示其中的元素。QGraphicsView负责显示一个场景中的部分或者全部图形元素。一个场景可以对应多个QGraphicsView对象,以显示一个场景的不同区域,或者以不同的方式来显示该场景。

Graphic/View框架还处理那些对图形元素进行操作的交互命令。例如,当用户单击左键、试图选择某个图形元素时,QGraphicsView将鼠标坐标换算为QGraphicsScene的坐标,遍历各个QGraphicsItem对象,判断哪个图形元素被单击。

QGraphicsScene维护一个列表,记录哪些图形元素被选中。另外,它还维护一个数据结构,记录哪个或者哪些图形元素获得聚焦。用户的键盘事件经由QGraphicsView传递给QGraphicsScene,后者将键盘事件传递给获得聚焦的图形元素。

Graphics View框架涉及如下图所示的3个坐标系。每个图形元素(QGraphicsItem对象)有其自身的坐标系,可以自由选择原点位置,坐标值具有浮点精度。所有图形元素组成的场景(QGraphicsScene对象)拥有自己的坐标系,可以自由选择原点位置,坐标值也具有浮点精度。以上两个坐标系和具体显示设备(比如屏幕)无关,所以它们的坐标值具有浮点精度。每个视图(QGraphicsView对象)也拥有自己的坐标系。由于这个坐标系和具体显示设备密切相关,而任何一个显示设备的分辨率都是有限的,因而这个坐标系中的坐标值只能是整数,不能是浮点数。该坐标系的坐标原点被固定为视图左上角。以上3个类的成员函数仅使用与该类对应的坐标系。

在这里插入图片描述

场景中的图形元素在二维空间上可能发生部分或者全部重叠,称为图形元素之间的碰撞。有些应用场合允许碰撞的发生,比如在类似于Visio这样的绘图程序中,用户可以将一个椭圆元素和一个文本元素重叠,得到一个内部有文字标注的椭圆图形。而其他一些应用场合则禁止碰撞的发生。比如在电路板布线程序中,表示电子元件的图形元素不能够碰撞。碰撞的检测是由QGraphicsScene和QGraphicsItem协作完成的。QGraphicsItem有一个虚函数shape(),负责返回其自身的轮廓。QGraphicsScene的成员函数collidingItems()负责查询场景中每个图形元素的轮廓,判断哪些元素和某个指定的元素相撞。

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

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

相关文章

【单目标优化算法】沙猫群优化算法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

4月24日~4月26日学习总结

一,刷题目情况,已经完成了8道题目,对于其中一些题目做一下题解。 这个题目的意思是找到的两个位置l和r,为了做到这个数组的l到r的子数组经过排序后,会变成输入的另外一个数组,这个题目的思路就是首先找到在…

服务(第十篇)Nginx和tomcat反向代理(动静分离)

正向代理: 当用户想访问某一网址时,用户先访问代理服务器,然后由代理服务器向目标网址发送请求最终将数据返回代理服务器,最后代理服务器将数据返回给用户这一过程我们称之为正向代理。 反向代理:基本流程是与正向代理…

(04)基础强化:接口,类型转换cast/convert,异常处理,传参params/ref/out,判断同一对象

一、复习 1、New的截断是指什么? new除了新开空间创建初始化对象外,还有一个隐藏父类同名方法的作用。 当子类想要隐藏父类同名的方法时用new,用了new后父类同名方法将到此为止,后面 继承的…

centos7部署FastDFS服务

一、安装需要的相关依赖 yum -y install make cmake gcc gcc-c 因为我的服务器已经安装了gcc,所以略去 使用gcc -v查看版本 yum -y install zip unzip 安装性能事件通知库 yum -y install libevent 安装nginx依赖 yum -y install libevent yum -y install zli…

最新版TensorFlow的GPU版本不支持原生Windows系统(大坑预警)

一、前言 首先需要说明,按照官方中文文档安装是无法正常检测到GPU的。因为TensorFlow 2.10是支持原生Windows系统GPU环境的最后版本,默认安装的版本都比较高。 中文文档没有说明,英文文档是有提到的: (我在GitHub上找…

操作系统之进程同步和互斥

目录 什么是进程同步和进程互斥 进程互斥的软件实现方法 进程互斥的硬件实现方法 互斥锁 信号量机制 用信号量实现进程互斥和同步 生产者消费者问题 多生产者多消费者问题 吸烟者问题 读者写者问题 哲学家进餐问题 管程 死锁 什么是进程同步和进程互斥 进程同步 进…

Scala之模式匹配与隐式转换

目录 模式匹配: 基础语法如下: 模式守卫: 类型匹配: 对象匹配 样例类: 偏函数: 偏函数的化简写法: 偏函数的使用: 隐式转换: 官方定义: 个人理解&…

Linux-使用mobaxterm连接虚拟机ubuntu

一、准备工作 VMware:16.0.0 Ubuntu:18.4 MobaxTerm:链接:https://pan.baidu.com/s/1dNsahe9wO5KrWlWXtNqT0A?pwdaz39 提取码:az39 二、实操 1.检查系统是否安装ssh service sshd status 如果显示未安装&#xff0…

基于MATLAB实现WSN(无线传感器网络)的LEACH(低能耗自适应集群层次结构)(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 低能耗自适应集群层次结构(“LEACH”)是一种基于 TDMA 的 MAC 协议,它与无线传感器网络 &a…

私有部署、重构企业软件,第四范式发布大模型“式说”

大模型领域再添重要一员! 4月26日,第四范式首次向公众展示其大模型产品「式说3.0」,并首次提出AIGS战略(AI-Generated Software):以生成式AI重构企业软件。式说将定位为基于多模态大模型的新型开发平台&…

RAC集群节点2异常时节点1的database实例无法提供服务问题的分析

在客户的数据库RAC集群环境中,节点2发生了异常,最终通过重启解决。在节点2发生异常的10分钟左右时间内,由于RAC集群节点2异常,此时节点1的database实例无法提供服务问题,程序操作报超时; 对此现象&#xf…

贪吃蛇小游戏(C++)

首先我们需要下载EasyX(具体的方法在EasyX专栏中有提到) easyX下载和绘制简单基本图形_小梁今天敲代码了吗的博客-CSDN博客 贪吃蛇这个游戏我们一定都玩过,玩家使用方向键操控一条“蛇”,蛇会朝着一个方向不断移动,玩…

开源Qt Ribbon控件——SARibbon的布局思路及介绍

开源Qt Ribbon控件——SARibbon的布局思路及介绍 SARibbon的布局SARibbon名词定义Office布局模式——SARibbonBar::OfficeStyleWPS布局模式——SARibbonBar::WpsLiteStylepannel的布局行数3行模式2行模式 测试案例特别注意 原文链接:https://blog.csdn.net/czyt1988…

Kafka3.0.0版本——生产者数据有序与乱序

目录 一、生产经验数据有序二、生产经验数据乱序2.1、kafka1.x版本之前保证数据单分区有序的条件2.2、kafka1.x版本及以后保证数据单分区有序的条件2.3、kafka1.x版本及以后开启幂等性数据单分区有序的原因 一、生产经验数据有序 单分区内,数据有序。如下图partion…

linux 安装php8.1 ZipArchive和libzip最新版扩展安装

1、概述 安装前咱们先看下我本地环境 [rootelk php8]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 7.9 (Maipo) [rootelk php8]# [rootelk php8]# ./bin/php -v PHP 8.1.18 (cli) (built: Apr 17 2023 13:15:17) (NTS) Copyright (c) The PHP Group Z…

24、LLVM编译流程

一、LLVM 1.1 LLVM概述 LLVM是构架编译器(compiler)的框架系统,以C编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本.LLVM计划启动于2000年,最初由美国…

阳光开朗孔乙己,会否奔向大泽乡

前言 🔥学历对职业关系到底有什么影响呢?🔥学历给我们带来了优势吗?🔥到底是什么造成了"孔乙己的长衫"? 孔乙己是中国清代作家鲁迅创作的一篇短篇小说,发表于1919年。这部作品被认为是…

三个练手的软件测试实战项目(附全套视频跟源码)偷偷卷死他们

项目一:12306抢票项目 项目测试目的 学会Selenium定位web元素的方法 熟练浏览器调试工具使用 项目主体步骤 1) 人工走一遍流程,对自动化的流程心中有数 2) 按步骤拆分,然后对每一个小步骤编写自动化脚本 3&#xff…

大淘宝技术斩获NTIRE 2023视频质量评价比赛冠军(内含夺冠方案)

近日,CVPR NTIRE 2023 Quality Assessment of Video Enhancement Challenge比赛结果公布,来自大淘宝音视频技术团队的同学组成「TB-VQA」队伍,从37支队伍中脱颖而出,拿下该比赛(唯一赛道)冠军。此次夺冠是团…