Qt中QGraphicsView总体架构学习

这篇具有很好参考价值的文章主要介绍了Qt中QGraphicsView总体架构学习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前沿

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

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

QGraphicsView架构

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

1:组成

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

Qt中QGraphicsView总体架构学习,Qt,学习

场景

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

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

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

视图

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

需要注意的两点

第一点:视图大于场景

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

第二点:视图小于场景

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

图形项

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

基类是:QGraphicsItem

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

Qt中QGraphicsView总体架构学习,Qt,学习

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

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);

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

Qt中QGraphicsView总体架构学习,Qt,学习

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

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

3:坐标

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

Qt中QGraphicsView总体架构学习,Qt,学习

视图坐标

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

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

场景坐标

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

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

图形项坐标

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

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

总结

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

我是糯诺诺米团,一名C++开发程序媛~文章来源地址https://www.toymoban.com/news/detail-782079.html

到了这里,关于Qt中QGraphicsView总体架构学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT QGraphicsView 提升到 QChartView报错 解决方案

    本文主要描述, 使用QT提供的QChartView来绘制图表,提升QGraphicsView控件 继承QChartView后,然后将QGraphicsView提升到我们自己写的类,怎么才能确保提升后编译不报错. 临时方案(主要是修改ui_xxxx.h文件) 终极解决方案(针对网上好多方案都是修改ui_xxx.h文件,然后重新编译后又报错,又要修改

    2024年02月05日
    浏览(38)
  • 【[Qt]基于QGraphicsView的图像显示控件,支持放大、缩小、鼠标拖动】

    ImageViewer.h文件 ImageViewer.cpp 文件 具体使用代码如下 1、初始化类对象,并加入界面布局中 2、打开图像,并加载到控件中 3、从控件中卸载图片 源码链接:https://download.csdn.net/download/xiaohuihuihuige/87239431 百度云: 链接:https://pan.baidu.com/s/1W-KUlIKUFAktUKFin63N0g 提取码:4g8a

    2024年02月11日
    浏览(62)
  • 《QT从基础到进阶·十五》用鼠标绘制矩形(QGraphicsView、QPainter、QGraphicsRectItem)

    以下是鼠标绘制矩形最全的一种用法,完整源码将会放在最后面。 QT版本:5.15.2 VS版本:2019 1、在界面加载一张图片 界面的搭建选用QGraphicsView,自定义类GraphicsView继承QGraphicsView,在主程序中点击按钮打开 图片,相关代码如下: 2、创建矩形绘制对象,并绘制、移动矩形 在

    2024年02月04日
    浏览(51)
  • Qt之QGraphicsView实现截图(漏洞百出且BUG丛生版,部分源码+注释)

    下方一次绘制的图元为:矩形、圆形、箭头、画笔。 下方为添加文本操作,演示文本过多时,文本框便捷不超出编辑区边界。 下方为演示设置弹窗更新画笔颜色、画笔粗细更新后的绘制效果。 下方为截图图片拖动效果,仅支持未添加图元的情况。 下方操作为截图保存当前截

    2024年02月02日
    浏览(38)
  • 【Qt】总体把握文本编码问题

    在项目开发中,经常会遇到文本编码问题。文本编码知识非常基础,但对于新手来说,可能需要花费较长的时间去尝试,才能在脑海中建立对编码的正确认知。文本编码原理并不难,难的是在项目实践中掌握正确处理文本编码的方法。本文从项目实践出发,总结了项目中编码

    2024年02月09日
    浏览(33)
  • 数学学科的总体架构是什么?

    整个数学学科的宏观体系由哪几部分组成?这一问题的回答属于数学史的范畴。数学史的研究属于整个数学领域的一个分支。研究数学史的人来回答这样的问题是轻而易举的,但是对于非数学史专业的人来说就比较困难。这好比要问整个刘姓家族分为哪几个分支,这个问题找

    2024年02月04日
    浏览(43)
  • 云安全防护总体架构设计

    安全需求和挑战 从风险管理的角度讲,主要就是管理资产、威胁、脆弱性 和防护措施及其相关关系,最终保障云计算平台的持续安全,以及 其所支撑的业务的安全。 云计算 平台是在传统 IT技术的基础上,增加了一个虚拟化层,并且具有了资源池化、按需分配,弹性调配,

    2024年02月01日
    浏览(44)
  • 【Qt图形视图框架】自定义QGraphicsItem和QGraphicsView,实现鼠标(移动、缩放)及键盘事件、右键事件

    说明 在使用Qt的图形视图框架实现功能时,一般会在其基础上进行自定义功能实现。 如:滚轮对场景的缩放,鼠标拖动场景中的项,以及可以在场景中进行右键操作等。 示例 myitem 为自定义QGraphicsItem,实现了边框、重绘事件、鼠标悬停、按键、右键菜单等功能。 myitem.h myi

    2024年02月04日
    浏览(50)
  • 云计算基础设施总体架构介绍

    云计算基础设施是指由硬件资源和资源抽象控制组件构成的支撑云计算的基础设施,包括为云服务客户提供计算资源、存储资源、网络资源、安全资源所需的软硬件设备及云管理平台。云计算基础设施总体架构如图1 所示。 图1 云计算基础设施总体架构  资源池包括计算资源

    2024年02月11日
    浏览(41)
  • kube-OVN总体架构

    本文档将介绍 Kube-OVN 的总体架构,和各个组件的功能以及其之间的交互。 总体来看,Kube-OVN 作为 Kubernetes 和 OVN 之间的一个桥梁,将成熟的 SDN 和云原生相结合。 这意味着 Kube-OVN 不仅通过 OVN 实现了 Kubernetes 下的网络规范,例如 CNI,Service 和 Networkpolicy,还将大量的 SDN 领域

    2023年04月12日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包