再贴一段代码:注意先把上面的代码屏蔽掉:

//坐标系实验QGraphicsScene *scene = new QGraphicsScene;MyGraphicsItem *item = new MyGraphicsItem;scene->addItem(item);//这个偏移是根据父类的偏移,而不是子类的,//如果不加后面的 item->setParentItem(rectItem); 父类就是场景scene了,就是根据scene的顶点偏移的。item->setPos(10, 10);//item->setZValue(1);QGraphicsRectItem *rectItem = scene->addRect(QRect(0, 0, 100, 100),QPen(Qt::blue), QBrush(Qt::green));item->setParentItem(rectItem);rectItem->setPos(40, 40);MyGraphicsView *view = new MyGraphicsView;view->setScene(scene);view->setForegroundBrush(QColor(255, 255, 0, 100));view->setBackgroundBrush(QPixmap("./ShowDebug/2.png"));view->resize(400, 300);view->show();

这里的item->setZValue(1);是来设置图形项的深度信息的,深度大的在上面,会把下面的盖住。当然由于我们自定义的项有点小,所以盖不住整个图。我们注释掉了这句话而是用 item->setParentItem(rectItem); ,作为子类,也会显示在父类上面,即先画父类,再在父类上画子类。注意这个时候的 item->setPos(10, 10); 是针对父类的偏移,也就是针对rectItem的偏移。

为了知道所谓的坐标值,我们修改一下MyGraphicsView里面的函数,加个:

void mousePressEvent(QMouseEvent *event);

然后定义实体:

void MyGraphicsView::mousePressEvent(QMouseEvent * event)
{// 分别获取鼠标点击处在视图、场景和图形项中的坐标,并输出QPoint viewPos = event->pos();DebugText::getDebugText()->addContents("viewPos: " + QString::number(viewPos.x())+" "+QString::number(viewPos.y()));// "viewPos: " << viewPos;QPointF scenePos = mapToScene(viewPos);DebugText::getDebugText()->addContents("scenePos: " +QString::number(scenePos.x()) + " " + QString::number(scenePos.y()));// "viewPos: " << viewPos;QGraphicsItem *item = scene()->itemAt(scenePos, QTransform());if (item) {QPointF itemPos = item->mapFromScene(scenePos);DebugText::getDebugText()->addContents("itemPos: " +QString::number(itemPos.x()) + " " + QString::number(itemPos.y()));// "viewPos: " << viewPos;}
}

这个程序的意义就是,我们点击了view区域以后,会先把视口坐标(实际物理坐标)打印出来,然后再把相应的物理坐标通过mapToScene转换到场景坐标,然后再打印场景坐标。之后判断点击的区域有没有图形项,如果有,就把图形项的坐标打印出来。

显示效果如下:我们分别点一下场景的原点,然后点一下绿色的大图形项左上角,再点一下小图形项的左上角:

注意因为屏幕分辨率实在是太高,我实在定位不到准确的右上角点,所以有所偏差。大家可以看到,首先第一个点很巧地点在了场景(0,0)位置,也就是背景图片的交点。这个交点在view视点的(109,59)的位置,这是因为默认把属于scene的图形项显示在窗口中间的缘故。点矩形,没有正好点在场景(40,40)的地方,横纵坐标都偏移了两格。然后第三次,我们点最里面的小图形项,注意这里的(6,6),是因为之前定义的图形项中我们是在(5,5)——(15,15)之间的区间画的,所以橘色区域的左上角在自己item的坐标是(5,5),(怕你们理解错再提一句,我也是实在难以正好点在(5,5)的位置上呀。。。)

现在我们把图形转一下:代码添加在本节第一个代码中。

rectItem->setRotation(30);

再在最后一行之前加一句:

scene->setSceneRect(0, 0, width(), height());

然后看效果:

首先是场景的原点变到了视图(实际物理显示区)的原点,这就是setSceneRect函数的作用,它把场景映射到物理区域的某一块地方。然后可以看到两个图形项都旋转了,这是因为我们调用父图形项,里面的子类也会一起旋转。

大家点一下各个区域,可以看到虽然旋转了,但是ItemPos自己的坐标点相对于旋转前并没有发生变动。

关于坐标系,这一节和上一节已经讲完了(我怎么可能告诉各位我是故意把一节的内容凑两节来讲呢),下一节会讲一下如何进行交互,以及限定图元的运动区域,如何在希望下一节能用一节讲完,这样我们就可以把和之前的xml文件解析的内容结合起来,开发一个传输函数控件系统了。

QT图形显示和处理7相关推荐

  1. Qt知识点汇总——来自网络

    为什么80%的码农都做不了架构师?>>>    1.程序可以显示中文 #include <QTextCodec> QTextCodec::setCodecForTr(QT ...

  2. 【Qt for Android】OpenGL ES 绘制彩色立方体

    Qt 内置对OpenGL ES的支持.选用Qt进行OpenGL ES的开发是很方便的,很多辅助类都已经具备.从Qt 5.0開始添加了一个QWindow类,该类既能够使用OpenGL绘制3D图形,也能够 ...

  3. 64位Ubuntu 12.04下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录

    最新公司搞一个新项目,需要在Linux下进行UI界面设计.选来选去,最后选择采用Qt平台来做,于是要开始研究一下Qt. Qt作为业内最著名的UI开发工具之一,是一套完整的跨平台C++图形用户界面应用程 ...

  4. python导入数据库的数据怎么在qt界面里刷新_Python中使用pyqtgraph库实现数据可视化之逐点刷新波形图...

    背景 pyqtgraph是Python平台上一种功能强大的2D/3D绘图库,相对于matplotlib库,由于内部实现方式上,使用了高速计算的numpy信号处理库以及Qt的GraphicsView框架 ...

  5. Qt、GTK 和KDE、GNOME的关系-转

    Linux 下的图形库介绍 在进行Linux下的图形系统编程时,我们常常会遇到以下这些概念: Framebuffer, X11, SDL,DFB, miniGUI, OpenGL,QT, GTK,KD ...

  6. c gui qt 4编程第二版_一本专门学习PyQt5 GUI编程的书

    Python作为一个开源的解释型编程软件,在教学.科研.实际项目中用得越来越多.Python易学易用,程序资源丰富,在编程解决一些科学计算问题时比较实用,但是Python自带的Tkinter包设计GU ...

  7. qt web混合编程_基于Qt与MATLAB的混合编程技术

    摘要:在Qt雷达仿真系统中,数据处理及图形显示尤为重要.本文为此提出了一种Qt与MATLAB混合编程的方法.通过VC++和MATLAB混合编程技术,将MATLAB函数封装成动态链接库,Qt调用这个动态 ...

  8. Qt编程(一) Qt框架简介

    1.Qt5 架构 qt 5将所有模块分为三个部分:Qt基本模块(Essentials).Qt扩展模块(Add-ons). 开发工具(Tools) 基本模块定义了基础功能,是核心,兼容所有平台.包括: ...

  9. QT Quick项目简介

     在Qt 4中,Qt Quick只是在QGraphicsView之上做了简单的封装,并通过QtScript和JavaScript来为其提供脚本支持.基于QGraphicsView之上的QML在功能上仅 ...

  10. Qt学习之显示类的控件(QLabel、QTextBrowser、QGraphicsView、QCalendarWidget、QWebView、QProgressBar、QOpenGLWidget)

    本文转自:<Qt编程指南>        作者:奇先生 Qt编程指南,Qt新手教程,Qt Programming Guide 5.5 显示类的控件 本节显示类控件是指作为显示用途的控件,本 ...

最新文章

  1. c#调用java开发的webservice_用C#.NET调用Java开发的WebService传递int,double问题
  2. vscode新建html,没有模板
  3. Invalid packet stream index
  4. 粤港澳大湾区菜篮子-农业大健康·林裕豪:从玉谋定功能产业
  5. TCP协议抓包分析 -- wireshark
  6. ABP从入门到精通(1):aspnet-zero-core项目启动及各项目源码说明
  7. 三条中线分的六个三角形_解读三角形中的三边关系和三条线段的应用
  8. 01 Oracle 导入SQL文件
  9. mongodb php存储日志,laravel 框架使用mongodb 保存日志
  10. ug西门子840d后处理教程_UG后处理制作教程.pdf
  11. 2022最全毕设题目选题
  12. 手机屏幕怎么计算机,怎样把手机屏幕投到电脑
  13. android源码分析!程序员怎样优雅度过35岁中年危机?送大厂面经一份!
  14. python 求和_python中求和
  15. 为什么说HHKB是程序员最好的键盘?
  16. mysql 自增 空洞_MySQL auto_increment空洞问题
  17. 南京艺术学院计算机考研,南京艺术学院考研难吗?一般要什么水平才可以进入?...
  18. html5 苹果 dock,基于JQuery模仿苹果桌面的Dock效果(初级版)
  19. 6.4 二项式系数和恒等式
  20. 极路由4/b70刷华硕(padavan)教程

热门文章

  1. 关于一系列斯坦福代码查重moss出问题的解决办法总和与注意事项
  2. 昆明理工大学计算机考研资料汇总
  3. “3D 元宇宙技术”在汽车新零售领域的应用与实践
  4. M0、M1、M2、M3、M4
  5. android如何加载一张大图片,Android 实现加载大图片的方法
  6. 人脸识别“火”了!网友:胖了、整容了怎么办?
  7. 【转】区块链:胖协议
  8. 训练GAN,你应该知道的二三事
  9. GAN介绍 - 提示与技巧
  10. SYNCookie原理