当前位置: 首页 > news >正文

Qt中QGraphicsView总体架构学习

前沿

前段时间学习了下如何在QGraphicsView架构中绘制刻度尺,主要是与OnPainter中进行比较的,那么今天就来详细讲解下我对QGraphicsView框架的认知吧~

最近一段时间想学习下,如果我有不正确的,欢迎留言探讨哟~

QGraphicsView架构

使用过OnPainter绘制过图形的,QPainter绘制需要在绘制设备的paintEvent()事件中实现,但是使用这种方式只能绘制复杂性不高的固定图形,对于图形的编辑、拖放修改等功能是无法实现的,所以,我们想要实现这些复杂功能时,QT为我们提供了QGraphicsView绘图架构,这是一种基于图形项的模型/视图模式

1:组成

QGraphics View架构主要由三部分组成:场景、视图、图形项

场景

对于我们程序展示来说,场景是不可见的,是一个抽象的管理图形项的容器。

可以向场景中添加图形项,比如:圆形、矩形、三角形等等

不仅如此,还可以获取场景中的某个图形项

视图

提供绘图的视图组件,用于显示场景中的内容。

需要注意的两点

第一点:视图大于场景

场景在视图的中间部分显示,也可以设置视图的Alignment属性控制场景在视图中的显示位置

第二点:视图小于场景

视图只能显示场景的一部分内容,但是会自动提供卷滚条在整个场景内移动

图形项

一些基本的图形元件,例如:椭圆、矩形等等

基类是:QGraphicsItem

对于这些基本的图形项也有线程的图形类

我们需要将绘制的图形项添加到场景中,所以一些图形项操作函数必然是要了解的

addItem:添加一个已经创建的图形项

removeItem:删除图形项

clear:清除所有图形项

一般情况下,使用上述三个函数的情况比较多

我在实现demo的时候,为了统一接口方便,将所有的绘图类全部继承自QGraphicsPathItem,并未采取基类QGraphicsItem。

因为我想要实现的功能比较多,单纯的QGraphicsRectItem已经无法满足后续的需求,索性都采用一个基类

2:图形例子

假设矩形类叫做:QShapeRectangular,父类是:QGraphicsPathItem

class QShapeRectangular : public QGraphicsPathItem
{
public:QShapeRectangular(const QPainterPath &path, QGraphicsItem *parent = nullptr);~QShapeRectangular();
protected:virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
private:QPainterPath m_path;
};

.cpp中主要绘制内容

//TODO:绘制矩形框的样式
painter->setRenderHint(QPainter::Antialiasing);
painter->setBrush(Qt::transparent);QPen pen(QColor(51, 51, 51));
pen.setCapStyle(Qt::SquareCap);
pen.setJoinStyle(Qt::RoundJoin);//选中后,图形变成虚线
if (option->state & QStyle::State_Selected)
{pen.setStyle(Qt::DashLine); //虚线
}
else
{pen.setStyle(Qt::SolidLine); //实线
}
painter->setPen(pen);
painter->drawPath(m_path);

根据上述绘制代码,可以清楚地看出来,当图形的状态变成选中时,需要改变线条的绘制方式。由实现变成了虚线。具体的展示效果如下:

为了更好的展示效果才用了点随鼠标滑动的效果。

具体的如何实现这种功能在下一篇文章中介绍~

3:坐标

在QGraphicsView架构中存在了三个有效的坐标系:图形项坐标、场景坐标、视图坐标

视图坐标

与设备坐标相同,是物理坐标,一般以左上角为圆点,单位是像素。

视图的坐标只与widget或者视口有关,而与场景无关,所有的鼠标事件、拖放事件的坐标首先是由视图坐标定义的,然后用户需要将这些坐标映射成场景坐标,以便程序中交互

场景坐标

等价于QPainter的逻辑坐标,一般以场景的中心为原点,单位是像素。

场景是所有图形项的基础坐标,描述了每个顶层图形项的位置。

图形项坐标

局部逻辑坐标,一般以图件的中心为原点

每个图形项在场景里都有一个位置坐标,是由QGraphicsItem::scenePos给出的。

总结

以上QGraphicsView中的简单场景就讲解完了,根据这些基础知识接下来的文章中进行各种图形项绘制,以及拖动、旋转、缩放等等操作~

我是糯诺诺米团,一名C++开发程序媛~

相关文章:

Qt中QGraphicsView总体架构学习

前沿 前段时间学习了下如何在QGraphicsView架构中绘制刻度尺,主要是与OnPainter中进行比较的,那么今天就来详细讲解下我对QGraphicsView框架的认知吧~ 最近一段时间想学习下,如果我有不正确的,欢迎留言探讨哟~ QGraphicsView架…...

STL-list的使用简介

目录 ​编辑 一、list的底层实现是带头双向循环链表 二、list的使用 1、4种构造函数(与vector类似)​编辑 2、迭代器iterator 3、容量(capicity)操作 4、element access 元素获取 5、增删查改 list modifiers 6、list的迭…...

MySQL:索引失效场景总结

1 执行计划查索引 通过执行计划命令可以查看查询语句使用了什么索引。 EXPLAIN SELECT * FROM ods_finebi_area WHERE areaName = 福建 执行查询计划后,key列的值就是被使用的索引的名称,若key列没有值表示查询未使用索引。 2 在什么列上创建索引 (1)列经常被用于where…...

LNMP平台对接redis服务

目录 1、安装 LNMP 各个组件 2、安装 redis 服务 3、安装 redis 扩展 4、修改 php 配置文件 5、测试连接 1、安装 LNMP 各个组件 2、安装 redis 服务 3、安装 redis 扩展 官网:http://redis.io/ 下载包: https://codeload.github.com/phpredis/p…...

5G之味,在烟火长沙

今年夏天,有一部电影叫做《长沙夜生活》。影片讲述了长沙大排档中的一些故事。网红大排档的老板娘、厨师、顾客,他们的邂逅、热爱、留下、离开、和解、团圆,都发生在一段夜色里,发生在充满烟火气的长沙城。 有没有想过这样一个问题…...

【MYSQL】MYSQL 的学习教程(十一)之 MySQL 不同隔离级别,都使用了哪些锁

聊聊不同隔离级别下,都会使用哪些锁? 1. MySQL 锁机制 对于 MySQL 来说,如果只支持串行访问的话,那么其效率会非常低。因此,为了提高数据库的运行效率,MySQL 需要支持并发访问。而在并发访问的情况下&…...

LORA的基本原理

本文将介绍如下内容: 什么是Lora高效微调的基本原理LORA的实现方式LORA为何有效? 一、什么是LoRA LoRA 通常是指低秩分解(Low-Rank Decomposition)算法,是一种低资源微调大模型方法,论文如下: LoRA: Low…...

Vue2x的自定义指令和render函数使用自定义指令

在某些情况下,我们需要对底层DOM进行操作,而内置的指令不能满足需求,就需要自定义指令。一个自定义指令由一个包含类似组件的生命周期的钩子的对象来定义,钩子函数会接收到指令所绑定的元素作为参数。 定义指令 常用两种方式进行…...

Linux学习(2):文件目录指令

Linux学习(2):文件目录指令 1 文件目录指令1.1 pwd 用来显示当前目录的绝对路径的1.2 ls 显示当前目录的信息1.3 cd 切换到指定目录1.4 mkdir 创建目录1.5 rmdir 删除空目录1.6 touch 创建空文件1.7 cp 拷贝文件到指定目录1.8 rm 移除文件或目…...

Dockerfile的ENV

文章目录 环境总结测试测试1测试2测试3测试4测试5测试6 参考 环境 RHEL 9.3Docker Community 24.0.7 总结 如果懒得看测试的详细信息,可以直接看结果: 一条 ENV 指令可以定义多个环境变量。Dockerfile里可以包含多条 ENV 指令。环境变量的值不需要用…...

【普中开发板】基于51单片机的简易密码锁设计( proteus仿真+程序+设计报告+讲解视频)

基于51单片机的简易密码锁设计 1.主要功能:资料下载链接: 实物图:2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单 【普中】基于51单片机的简易密码锁设计 ( proteus仿真程序设计报告讲解视频) 仿真图proteus8.16(有低版本) 程…...

c语言之输出函数用法 putchar

putchar函数 putchar函数是c语言输出函数&#xff0c;但它只能输出单个字符&#xff0c;如果要输出字符串就不合适了。 应用举例 #include<stdio.h> int main() {putchar(a);putchar(4);putchar(\n);return 0: } 从上面代码可以看出&#xff0c;单字符必须用单引号’…...

高精度原边控制电路D3820,CC/CV精度±5%以内,可作为10W以下小功率、低待机功耗的电源替代,可兼容OB2520

高精度原边控制离线式PWM功率开关 特点 1、全电压范围CC/CV精度保持在5%以内 2、用原边控制&#xff0c;无需TL431和光耦 3、欠压锁定&#xff08;UVLO&#xff09;及自动重启 4、驱动BJT 5、内置前沿消隐&#xff08;LEB&#xff09; 6、逐周期限流模式 7、输出线压降…...

Python库学习(十四):ORM框架-SQLAlchemy

1.介绍 SQLAlchemy 是一个用于 Python 的 SQL 工具和对象关系映射&#xff08;ORM&#xff09;库。它允许开发者通过 Python 代码而不是 SQL查询语言来操作数据库。SQLAlchemy 提供了一种灵活且强大的方式来与关系型数据库交互&#xff0c;支持多种数据库后端&#xff0c;如 P…...

信息学奥赛一本通1014:与圆相关的计算

1014&#xff1a;与圆相关的计算 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 167892 通过数: 85008 【题目描述】 给出圆的半径&#xff0c;求圆的直径、周长和面积。输入圆的半径实数r&#xff0c;输出圆的直径、周长、面积&#xff0c;每个数保留小数点后4…...

Vscode——通过SSH连接服务器

1、打开vscode —— 点击左下角 2、选择SSH 3、点击后会自动安装三个插件 4、点击左下角——连接服务器 5、再次点击左下角——连接服务器 6、登录成功后打开终端即可操作 快捷键&#xff1a;ctrl ~ 7、查看编辑服务器文件目录 点击文件——打开文件夹 8、确定后再次输入登录密…...

UE5 通过接口实现角色描边效果

接口不能够被实例化&#xff0c;不能够在内部书写函数的逻辑和设置属性&#xff0c;只能够被继承使用。它能够让不同的类实现有相同的函数&#xff0c;继承接口的类必须实现接口的函数。 并且&#xff0c;我们可以在不同的类里面的函数实现也不同&#xff0c;比如A类描边是红色…...

电脑提示dll丢失怎么办,教你一招将dll修复

使用电脑时&#xff0c;你的电脑是否出现关于dll文件丢失或找不到的问题&#xff0c;出现这种问题又该如何解决呢&#xff0c;dll文件问题会导致软件无法打开&#xff0c;或者会导致系统崩溃。今天就来教大家如何快速解决dll文件修复。 一.如何修复dll修复 方法一&#xff1a;…...

MATLAB mat 文件

1.mat文件格式 MATLAB&#xff08;Matrix Laboratory&#xff09;使用 .mat 文件格式来存储和加载数据。MAT 文件是一种二进制文件格式&#xff0c;能够保存 MATLAB 中的各种数据类型&#xff0c;包括矩阵、向量、结构体、元胞数组等。 特定和用途&#xff1a; 二进制格式&a…...

Linux du和df命令

目录 一. df二. du 一. df ⏹用于显示系统级别&#xff0c;磁盘分区上的可用和已用空间的信息 -h&#xff1a;以人类可读的格式显示文件系统大小 ⏹每秒钟监视当前磁盘的使用情况 watch 用于周期性的执行特定的命令-n 1 表示每一秒刷新一次命令执行的结果df -h ./ 表示周期性…...

基于Vue3+TypeScript的ChatGPT风格前端界面集成实战

1. 项目概述与核心价值最近在折腾一个个人项目&#xff0c;想给一个静态网站加上智能对话的能力&#xff0c;让访客能随时问点问题。一开始想自己从零搭建&#xff0c;但考虑到前后端、AI接口、实时通信这些环节&#xff0c;工作量着实不小。后来在GitHub上逛的时候&#xff0c…...

LabVIEW通过OPC DA连接任意PLC:架构、配置与实战指南

1. 项目概述&#xff1a;为什么是LabVIEWOPC&#xff1f; 如果你在工业自动化、测试测量或者数据采集领域摸爬滚打过一阵子&#xff0c;大概率听过LabVIEW的大名&#xff0c;也可能被各种PLC&#xff08;可编程逻辑控制器&#xff09;五花八门的通讯协议搞得头疼。把LabVIEW和任…...

WinForm用户控件调试踩坑记:从‘无法试运行’到完美模块测试的完整流程

WinForm用户控件调试实战&#xff1a;从模块移植到精准测试的完整指南 引言&#xff1a;为什么需要独立的控件测试环境&#xff1f; 在WinForm开发中&#xff0c;用户控件(UserControl)的复用与调试一直是让开发者头疼的问题。当你在主项目中直接测试一个复杂控件时&#xff0c…...

Python封装币安API:从零构建Binance-Claw量化数据工具

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“Binance-Claw”&#xff0c;作者是Scandalousnessmotley216。光看这个名字&#xff0c;可能有点摸不着头脑&#xff0c;“Claw”是爪子的意思&#xff0c;难道是要“抓取”币安的数据&#xff1f;点…...

HoRain云--VS Code 创建与使用 Skill

&#x1f3ac; HoRain 云小助手&#xff1a;个人主页 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …...

大多数癌症没有微生物组?Cell:有还是无,这是个问题

小编导读&#xff1a;这项发表于《Cell》的重磅研究对16,369个肿瘤全基因组进行了系统的微生物信号分析&#xff0c;开发并验证了名为PathSeq-T2T的宿主过滤与去污染流程。研究发现&#xff0c;大多数癌症类型的微生物信号在去污染后与背景无法区分&#xff0c;唯有口消化道癌&…...

ASReview实战:用主动学习技术高效完成文献综述

1. 项目概述&#xff1a;当学术文献综述遇上主动学习如果你是一名研究生、科研人员&#xff0c;或者任何需要从海量文献中筛选出相关研究的人&#xff0c;那么“大海捞针”这个词你一定深有体会。面对动辄成千上万篇的论文标题和摘要&#xff0c;传统的人工筛选不仅耗时耗力&am…...

BOX工控机在无人机机载系统中有什么优势?这 3 点是普通工控机比不了的

现在的无人机机载系统&#xff0c;越来越多的人选择用 BOX工控机。很多人问我&#xff0c;BOX工控机到底是什么?它和普通的工控机有什么区别?为什么大家都在用它?今天我就跟大家好好聊聊这个话题。我会从一个 17 年工控人的角度&#xff0c;给大家讲透 BOX工控机在无人机机载…...

告别手改脚本!用CANoe Panel面板做个变量控制台,测试效率翻倍

告别手改脚本&#xff01;用CANoe Panel面板打造智能变量控制台 在车载网络测试领域&#xff0c;效率提升往往隐藏在那些被忽视的日常操作细节中。当测试工程师频繁打开CAPL脚本修改超时阈值、调整诊断ID或切换测试模式时&#xff0c;不仅打断了工作流&#xff0c;更在团队协作…...

我的Claude Code不再被封号,Taotoken提供了稳定可靠的替代方案

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 我的Claude Code不再被封号&#xff0c;Taotoken提供了稳定可靠的替代方案 作为一名频繁使用Claude Code进行代码生成和审查的个人…...