Qt学习笔记--图形视图框架讲课讲稿.doc
《Qt学习笔记--图形视图框架讲课讲稿.doc》由会员分享,可在线阅读,更多相关《Qt学习笔记--图形视图框架讲课讲稿.doc(22页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Good is good, but better carries it.精益求精,善益求善。Qt学习笔记-图形视图框架-Qt学习笔记-图形视图框架(一)2010-07-1107:40优点:处理多个图元,单击,拖动,选择图元架构:一个场景,多个图元位于其中,通过视图显示主要应用:绘图软件,显示地图软件当使用没有变换的视图观察场景时,场景中的一个单元对应屏幕上的一个像素图元坐标通常以图元中心为原点,X轴正方向为向右,Y轴正方向为向下场景坐标的原点在场景中心,X轴正方向为向右,Y轴正方向为向下视图坐标以左上角为原点,X轴正方向为向右,Y轴正方向为向下所有的鼠标事件最开始都是使用视图坐标场景:图元的容
2、器1.提供管理很多图元的接口2.传播事件到图元中3.管理图元状态,例如选择和焦点处理4.提供非转换的绘制功能,主要用于打印QGraphicsScenescene;QGraphicsRectItem*rect=scene.addRect(QRectF(0,0,100,100);/添加图元QGraphicsItem*item=scene.itemAt(50,50);/查询图元/item=rect;通过QGraphicsScene:setSelectionArea()可以选择场景的任一个图元,QGraphicsScene:setSelectedItems()返回被选择的图元设置焦点图元QGraphi
3、csScene:setFocusItem(),setFocus(),QGraphicsScene:focusItem(),返回焦点图元视图:一个可视的子部件,可视化场景的内容多个视图可以显示同一个场景坐标转换:QGraphicsView:mapToScene(),QGraphicsView:mapFromScene()图元:支持鼠标事件,滚轮事件,上下文菜单事件支持键盘输入焦点,按键事件支持拖放支持分组冲突探测提供坐标转换,图元与场景,图元与图元之间利用QGraphicsItem:shape()和QGraphicsItem:collidesWith()实现冲突探测,这2个函数都是虚函数相关类:
4、QGraphicsScene,QGraphicsItem,QGraphicsViewQGraphicsItem子类:QGraphicsEllipseItemprovidesanellipseitemQGraphicsLineItemprovidesalineitemQGraphicsPathItemprovidesanarbitrarypathitemQGraphicsPixmapItemprovidesapixmapitemQGraphicsPolygonItemprovidesapolygonitemQGraphicsRectItemprovidesarectangularitemQGra
5、phicsSimpleTextItemprovidesasimpletextlabelitemQGraphicsTextItemprovidesanadvancedtextbrowseritemQGraphicsSvgItemprovidesaSVGfileitemQGraphicsScene:拥有多个图元,包含三层:背景层,图元层,前景层背景层和前景层可以使用QBrush绘制,也可以使用drawBackground(),drawForeground()实现如果使用图片作为背景,可以用textureQBrush(pixmap)实现前景层brush可以使用半透明的白色实现褪色效果,或者使用交叉模
6、式实现网格重叠场景可以告诉我们,哪些图元发生冲突,哪些图元被选择,哪些图元位于一个特定的点或者区域每个图元可以是:1.顶级图元,场景是它的父亲;2.孩子,它的父亲是另一个图元,任何作用于父图元的转换都将自动应用于它的孩子2种分组方式:1.一个图元成为另一个图元的孩子;2.使用QGraphicsItemGroup。使用分组,可以使位于同一个组的所有图元的操作都相同QGraphicsView:是一个Widget,用于显示一个场景,提供滚动条功能和转换功能,可以缩放和旋转场景。默认使用内建的2D画图引擎,可以使用OpenGL:在构造后,调用setViewport()坐标系统:使用3种坐标系统:vie
7、wport,scene,itemviewport:位于QGraphicsView内部scene:逻辑坐标用于定位顶级图元item:与图元相关,以图元的(0,0)为中心,移动图元时,它的坐标不会改变实践中,主要关注场景坐标(定位顶级图元)和图元坐标(定位子图元和绘制图元)在图元自己的坐标系统里面绘图意味着我们不用担心它在场景中的位置和应用于它的坐标转换Demo:/主要特点:/上下文菜单,右键菜单/copy-paste方法/diagram.proTEMPLATE=appHEADERS=diagramwindow.hlink.hnode.hpropertiesdialog.hSOURCES=diag
8、ramwindow.cpplink.cppmain.cppnode.cpppropertiesdialog.cppFORMS=propertiesdialog.uiRESOURCES=resources.qrc/link.h#ifndefLINK_H#defineLINK_H#includeclassNode;classLink:publicQGraphicsLineItem/如果使用信号和槽,采用多继承publicQObjectpublic:Link(Node*fromNode,Node*toNode);Link();Node*fromNode()const;Node*toNode()con
9、st;voidsetColor(constQColor&color);QColorcolor()const;voidtrackNodes();/节点移动时,跟踪节点private:Node*myFromNode;/连线的2个节点Node*myToNode;#endif/link.cpp#include#includelink.h#includenode.hLink:Link(Node*fromNode,Node*toNode)myFromNode=fromNode;myToNode=toNode;myFromNode-addLink(this);/节点增加连线,每个节点有任意多个连线myToN
10、ode-addLink(this);setFlags(QGraphicsItem:ItemIsSelectable);/连线可以被选择,然后删除setZValue(-1);/在场景中显示的前后层次,因为连线是两个节点的中心,-1表示位于最后面,/节点覆盖了部分连线setColor(Qt:darkRed);/设置线的颜色trackNodes();Link:Link()myFromNode-removeLink(this);/删除连线时,将删除它在节点中的记录myToNode-removeLink(this);Node*Link:fromNode()constreturnmyFromNode;No
11、de*Link:toNode()constreturnmyToNode;voidLink:setColor(constQColor&color)setPen(QPen(color,1.0);QColorLink:color()constreturnpen().color();voidLink:trackNodes()/pos()返回节点在场景中或者父图元中的位置setLine(QLineF(myFromNode-pos(),myToNode-pos();/node.h#ifndefNODE_H#defineNODE_H#include#include#include#includeclassL
12、ink;classNode:publicQGraphicsItemQ_DECLARE_TR_FUNCTIONS(Node)/在此类中增加tr()功能,直接使用,而不需要QObject:tr()了public:Node();Node();voidsetText(constQString&text);QStringtext()const;voidsetTextColor(constQColor&color);QColortextColor()const;voidsetOutlineColor(constQColor&color);QColoroutlineColor()const;voidsetB
13、ackgroundColor(constQColor&color);QColorbackgroundColor()const;voidaddLink(Link*link);voidremoveLink(Link*link);QRectFboundingRect()const;/重新实现,决定一个图元是否需要绘制,必须的QPainterPathshape()const;/重新实现,返回图元的精确形状,/决定一个点是否在图元内,或者2个图元是否发生冲突voidpaint(QPainter*painter,/重新实现,画图,必须的constQStyleOptionGraphicsItem*optio
14、n,QWidget*widget);protected:voidmouseDoubleClickEvent(QGraphicsSceneMouseEvent*event);/双击事件,修改节点的文本QVariantitemChange(GraphicsItemChangechange,/重新实现,图元变化时,相关的连线发生变化constQVariant&value);/没有使用mouseMoveEvent(),/是因为程序可以改变节点位置private:QRectFoutlineRect()const;introundness(doublesize)const;QSetmyLinks;QStr
15、ingmyText;QColormyTextColor;QColormyBackgroundColor;QColormyOutlineColor;#endif/link.cpp#include#includelink.h#includenode.hNode:Node()myTextColor=Qt:darkGreen;myOutlineColor=Qt:darkBlue;myBackgroundColor=Qt:white;setFlags(ItemIsMovable|ItemIsSelectable);/节点可以移动,被选择Node:Node()foreach(Link*link,myLin
16、ks)/删除所有的连线,防止边界效应,不使用aDeleteAll()deletelink;voidNode:setText(constQString&text)prepareGeometryChange();/改变节点内的文本时,矩形可能会发生变化myText=text;update();QStringNode:text()constreturnmyText;voidNode:setTextColor(constQColor&color)myTextColor=color;update();QColorNode:textColor()constreturnmyTextColor;voidNod
17、e:setOutlineColor(constQColor&color)myOutlineColor=color;update();QColorNode:outlineColor()constreturnmyOutlineColor;voidNode:setBackgroundColor(constQColor&color)myBackgroundColor=color;update();QColorNode:backgroundColor()constreturnmyBackgroundColor;voidNode:addLink(Link*link)myLinks.insert(link)
18、;/增加连线时,记录连线voidNode:removeLink(Link*link)myLinks.remove(link);QRectFNode:boundingRect()const/View决定是否绘制矩形constintMargin=1;returnoutlineRect().adjusted(-Margin,-Margin,+Margin,+Margin);QPainterPathNode:shape()const/View用于冲突探测QRectFrect=outlineRect();QPainterPathpath;path.addRoundRect(rect,roundness(
19、rect.width(),roundness(rect.height();returnpath;/绘制图元voidNode:paint(QPainter*painter,constQStyleOptionGraphicsItem*option,QWidget*/*widget*/)QPenpen(myOutlineColor);if(option-state&QStyle:State_Selected)/图元被选择pen.setStyle(Qt:DotLine);pen.setWidth(2);painter-setPen(pen);painter-setBrush(myBackgroundC
20、olor);QRectFrect=outlineRect();painter-drawRoundRect(rect,roundness(rect.width(),roundness(rect.height();painter-setPen(myTextColor);painter-drawText(rect,Qt:AlignCenter,myText);/双击节点,弹出标准输入对话框voidNode:mouseDoubleClickEvent(QGraphicsSceneMouseEvent*event)QStringtext=QInputDialog:getText(event-widget
21、(),tr(EditText),tr(Enternewtext:),QLineEdit:Normal,myText);if(!text.isEmpty()setText(text);/拖动节点时,调用此函数QVariantNode:itemChange(GraphicsItemChangechange,constQVariant&value)if(change=ItemPositionHasChanged)foreach(Link*link,myLinks)link-trackNodes();returnQGraphicsItem:itemChange(change,value);QRectF
22、Node:outlineRect()constconstintPadding=8;QFontMetricsFmetrics=qApp-font();QRectFrect=metrics.boundingRect(myText);rect.adjust(-Padding,-Padding,+Padding,+Padding);rect.translate(-rect.center();returnrect;intNode:roundness(doublesize)constconstintDiameter=12;return100*Diameter/int(size);/diagramwindo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Qt 学习 笔记 图形 视图 框架 讲课 讲稿
限制150内