QT图形显示和处理7
再贴一段代码:注意先把上面的代码屏蔽掉:
//坐标系实验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相关推荐
- Qt知识点汇总——来自网络
为什么80%的码农都做不了架构师?>>> 1.程序可以显示中文 #include <QTextCodec> QTextCodec::setCodecForTr(QT ...
- 【Qt for Android】OpenGL ES 绘制彩色立方体
Qt 内置对OpenGL ES的支持.选用Qt进行OpenGL ES的开发是很方便的,很多辅助类都已经具备.从Qt 5.0開始添加了一个QWindow类,该类既能够使用OpenGL绘制3D图形,也能够 ...
- 64位Ubuntu 12.04下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录
最新公司搞一个新项目,需要在Linux下进行UI界面设计.选来选去,最后选择采用Qt平台来做,于是要开始研究一下Qt. Qt作为业内最著名的UI开发工具之一,是一套完整的跨平台C++图形用户界面应用程 ...
- python导入数据库的数据怎么在qt界面里刷新_Python中使用pyqtgraph库实现数据可视化之逐点刷新波形图...
背景 pyqtgraph是Python平台上一种功能强大的2D/3D绘图库,相对于matplotlib库,由于内部实现方式上,使用了高速计算的numpy信号处理库以及Qt的GraphicsView框架 ...
- Qt、GTK 和KDE、GNOME的关系-转
Linux 下的图形库介绍 在进行Linux下的图形系统编程时,我们常常会遇到以下这些概念: Framebuffer, X11, SDL,DFB, miniGUI, OpenGL,QT, GTK,KD ...
- c gui qt 4编程第二版_一本专门学习PyQt5 GUI编程的书
Python作为一个开源的解释型编程软件,在教学.科研.实际项目中用得越来越多.Python易学易用,程序资源丰富,在编程解决一些科学计算问题时比较实用,但是Python自带的Tkinter包设计GU ...
- qt web混合编程_基于Qt与MATLAB的混合编程技术
摘要:在Qt雷达仿真系统中,数据处理及图形显示尤为重要.本文为此提出了一种Qt与MATLAB混合编程的方法.通过VC++和MATLAB混合编程技术,将MATLAB函数封装成动态链接库,Qt调用这个动态 ...
- Qt编程(一) Qt框架简介
1.Qt5 架构 qt 5将所有模块分为三个部分:Qt基本模块(Essentials).Qt扩展模块(Add-ons). 开发工具(Tools) 基本模块定义了基础功能,是核心,兼容所有平台.包括: ...
- QT Quick项目简介
在Qt 4中,Qt Quick只是在QGraphicsView之上做了简单的封装,并通过QtScript和JavaScript来为其提供脚本支持.基于QGraphicsView之上的QML在功能上仅 ...
- Qt学习之显示类的控件(QLabel、QTextBrowser、QGraphicsView、QCalendarWidget、QWebView、QProgressBar、QOpenGLWidget)
本文转自:<Qt编程指南> 作者:奇先生 Qt编程指南,Qt新手教程,Qt Programming Guide 5.5 显示类的控件 本节显示类控件是指作为显示用途的控件,本 ...
最新文章
- c#调用java开发的webservice_用C#.NET调用Java开发的WebService传递int,double问题
- vscode新建html,没有模板
- Invalid packet stream index
- 粤港澳大湾区菜篮子-农业大健康·林裕豪:从玉谋定功能产业
- TCP协议抓包分析 -- wireshark
- ABP从入门到精通(1):aspnet-zero-core项目启动及各项目源码说明
- 三条中线分的六个三角形_解读三角形中的三边关系和三条线段的应用
- 01 Oracle 导入SQL文件
- mongodb php存储日志,laravel 框架使用mongodb 保存日志
- ug西门子840d后处理教程_UG后处理制作教程.pdf
- 2022最全毕设题目选题
- 手机屏幕怎么计算机,怎样把手机屏幕投到电脑
- android源码分析!程序员怎样优雅度过35岁中年危机?送大厂面经一份!
- python 求和_python中求和
- 为什么说HHKB是程序员最好的键盘?
- mysql 自增 空洞_MySQL auto_increment空洞问题
- 南京艺术学院计算机考研,南京艺术学院考研难吗?一般要什么水平才可以进入?...
- html5 苹果 dock,基于JQuery模仿苹果桌面的Dock效果(初级版)
- 6.4 二项式系数和恒等式
- 极路由4/b70刷华硕(padavan)教程