Qt — Graphics/View框架

news2024/11/15 16:04:24

文章目录

  • 前言
  • 一、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.coloradmin.cn/o/452389.html

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

相关文章

三谈ChatGPT(ChatGPT可以解决问题的90%)

这是我第三次谈ChatGPT,前两篇主要谈了ChatGPT的概念,之所以火的原因和对人们的影响,以及ChatGPT可能存在的安全风险和将面临的监管问题。这一篇主要讲讲ChatGPT的场景和处理问题的逻辑。 这一次我特意使用了ChatGPT中文网页版体验了一番。并…

3个月,从功能测试进阶到自动化测试涨薪10k,我悟了....

因为我最近在分享自动化测试技术,经常被问到: 功能测试想转自动化,请问应该怎么入手?有没有好的资源推荐? 那么,接下来我就结合自己的经历聊一聊我是如何在工作中做自动化测试的。(学习路线和…

EIGRP配置 路由过滤和汇总,以及默认路由

1.4.1 实验目的 通过对 EIGRP 路由过滤,汇总以及默认路由配置的实验的练习,从而掌握 EIGRP 路由过 滤的方法,EIGRP 路由汇总的方法和作用,以及如何为 EIGRP 配置默认路由。 1.4.2 实验拓扑 1.4.3 实验步骤 配置 R1&#xff0c…

【深度学习】计算分类模型的分类指标,计算accuracy_top-1、accuracy_top-5、precision、recall和f1_score

计算accuracy_top-1、accuracy_top-5、precision、recall和f1_score: (1)accuracy_top-1 np.sum(np.argmax(preds, axis1) np.argmax(actual, axis1)) / actual.shape[0] accuracy_top-1指标是假设预测数据中,最大值的index就是…

自动控制原理模拟卷8

自动控制原理模拟题八 Question1 求解以下电网络和机械系统的传递函数,并证明下图的电网络和机械系统有相同的数学模型。 解: 【图 ( a ) ({\rm a}) (a)系统传递函数】 根据复数阻抗的方法可得电网络的传递函数为:

为啥运维人员更喜欢 NeoVim 而不是 Vim?这8个原因或许是答案,命令对比一目了然!

在 Linux 系统中,编辑器是开发和系统管理的必备工具。而在众多编辑器中,Vim 作为一款经典的文本编辑器,一直备受欢迎。然而,随着时间的推移,NeoVim 的出现逐渐成为了 Linux 运维人员的首选。那么,为什么 Li…

Opencv+Python笔记(七)边缘检测原理

注意:梯度计算总是由右边减去左边 目录 一、边缘检测原理二、Sobel算子(基于搜索)三、Laplacian算子(基于零穿越)四、Candy边缘检测算法1.消除噪声2. 计算图像的亮度梯度值3.减除虚假边缘(非极大值抑制NMS&#xff09…

OSCP-Sirol(docker容器到宿主机)

目录 扫描 WEB 提权 扫描 sudo nmap 192.168.64.54 -p- -sS -sVPORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.4p1 Debian 10+deb9u7 (protocol 2.0) 53/tcp closed domain 80/tcp open http Apache httpd 2.4.25 ((Debian)) 3306…

Spring更简单的存取方法

Spring存对象 在Spring的创建和使用篇章里,提到了用bean标签来将对象标识到Spring里面,但是这样的方法过于麻烦,下面我们来介绍使用类注解来存储对象。 五大类注解存对象 Spring里面有五大类注解: Controller、Service、Repos…

NeRF必读五:NeRF in the wild

前言 NeRF从2020年发展至今,仅仅三年时间,而Follow的工作已呈井喷之势,相信在不久的将来,NeRF会一举重塑三维重建这个业界,甚至重建我们的四维世界(开头先吹一波)。NeRF的发展时间虽短&#xf…

ubuntu 3060显卡驱动+cuda+cudnn+pytorch+pycharm+vscode

文章目录 运行环境:适用:思路:1.1 3060显卡驱动自动安装2.1 CUDA11.1.11)下载CUDA Toolkit 11.1 Update 1 Downloads2)contunue , 然后accept3)回车取消Driver安装,然后install4)添加环境变量5)确认是否安装成功 3.1 cudnn 8.1.11…

【git安装、使用、常用命令】

文章目录 一、git下载与安装二、git的使用1.初次运行配置git2、本地新建版本仓库3、提交代码 总结(git 常用命令) 一、git下载与安装 1、下载链接: Git(Git 主程序)https://git-scm.com/downloads 根据自身电脑操作系…

客户端请求耗时严重原因排查优化 (Nginx导致)

客户端请求耗时严重,初步从几个方面进行排查 1.检查网络连接,是否实现丢包,网络波动,网络拥堵等问题。 2.检查客户端请求耗时和project api 接口耗时差异,判断是nginx问题还是接口问题 如果是nginx耗时导致&#xff0c…

podman pull或者push http镜像遇到http: server gave HTTP response to HTTPS client

原因:Docker自从1.3.X之后docker registry交互默认使用的是HTTPS,但是搭建私有镜像默认使用的是HTTP服务,所以与私有镜像交时出现以上错误 解决方案: #增加以下配置 vi /etc/containers/registries.conf [[registry]] location "…

mac gitstats查看git提交记录

一、介绍: 进一步来讲,Gitstats它是一个git仓库分析软件,它可以检查仓库并生成历史数据的统计信息。可以帮助你查看git仓库的提交状态,根据不同维度分析计算,并自动生成数据图表。 官网介绍:http://gitst…

基于 DolphinDB 机器学习的出租车行程时间预测

DolphinDB 集高性能时序数据库与全面的分析功能为一体,可用于海量结构化数据的存储、查询、分析、实时计算等,在工业物联网场景中应用广泛。本文以纽约出租车行程时间预测为例,介绍如何使用 DolphinDB 训练机器学习模型,并进行实时…

python+vue古诗词鉴赏学习网站vue+django国学经典在线学习系统

国古典诗词,是中华传统文化的瑰宝,民族精神的精华,是中国传统文化的精粹,在中国璀灿的古代文化中占有重要的地位。古诗不仅内涵丰富、包罗万象、意境深邃,具有很高的审美价值和很强的艺术感染力,而且语言凝练、短小精悍,词句优美,韵体和谐,使…

大数据周会-本周学习内容总结011

开会时间:2023.04.23 15:00 线下会议 目录 01【spark】 02【es同步mysql】 03【下周任务】 01【spark】 尚硅谷大数据技术Spark教程-笔记01【Spark(概述、快速上手、运行环境、运行架构)】尚硅谷大数据技术Spark教程-笔记02【SparkCore&am…

vue2 路由相关知识点

文章目录 1. 搭建路由组件1.1 安装 vue-router1.2 配置路由 2. 使用路由3. 路由的跳转3.1 声明式导航3.2 编程式导航 4. 路由传参4.1 路由传递参数 : 字符串形式4.2 路由传递参数 : 对象写法4.3 路由传参相关面试题 5. meta 使用6. 重写 push 和 replace 方法 1. 搭建路由组件 …

6 计时器(六)

6.7 TMI编码器接口 Encoder Interface 编码器接口 编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度 每个高级定时器和通…