Qt学习笔记--图形视图框架(共12页).doc
《Qt学习笔记--图形视图框架(共12页).doc》由会员分享,可在线阅读,更多相关《Qt学习笔记--图形视图框架(共12页).doc(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上Qt学习笔记-图形视图框架(一)2010-07-11 07:40优点:处理多个图元,单击,拖动,选择图元架构:一个场景,多个图元位于其中,通过视图显示主要应用: 绘图软件,显示地图软件当使用没有变换的视图观察场景时,场景中的一个单元对应屏幕上的一个像素图元坐标通常以图元中心为原点,X轴正方向为向右,Y轴正方向为向下场景坐标的原点在场景中心,X轴正方向为向右,Y轴正方向为向下视图坐标以左上角为原点,X轴正方向为向右,Y轴正方向为向下所有的鼠标事件最开始都是使用视图坐标场景:图元的容器1.提供管理很多图元的接口2.传播事件到图元中3.管理图元状态,例如选择和焦点处理4.提
2、供非转换的绘制功能,主要用于打印QGraphicsScene scene;QGraphicsRectItem *rect = scene.addRect(QRectF(0, 0, 100, 100); / 添加图元QGraphicsItem *item = scene.itemAt(50, 50); / 查询图元/ item = rect;通过QGraphicsScene:setSelectionArea()可以选择场景的任一个图元,QGraphicsScene:setSelectedItems()返回被选择的图元设置焦点图元QGraphicsScene:setFocusItem(), set
3、Focus(),QGraphicsScene:focusItem(), 返回焦点图元视图:一个可视的子部件,可视化场景的内容多个视图可以显示同一个场景坐标转换:QGraphicsView:mapToScene(), QGraphicsView:mapFromScene()图元:支持鼠标事件,滚轮事件,上下文菜单事件支持键盘输入焦点,按键事件支持拖放支持分组冲突探测提供坐标转换,图元与场景,图元与图元之间利用QGraphicsItem:shape()和QGraphicsItem:collidesWith()实现冲突探测,这2个函数都是虚函数相关类:QGraphicsScene, QGraphic
4、sItem, QGraphicsViewQGraphicsItem子类:QGraphicsEllipseItem provides an ellipse itemQGraphicsLineItem provides a line itemQGraphicsPathItem provides an arbitrary path itemQGraphicsPixmapItem provides a pixmap itemQGraphicsPolygonItem provides a polygon itemQGraphicsRectItem provides a rectangular itemQ
5、GraphicsSimpleTextItem provides a simple text label itemQGraphicsTextItem provides an advanced text browser itemQGraphicsSvgItem provides a SVG file itemQGraphicsScene:拥有多个图元,包含三层:背景层,图元层,前景层背景层和前景层可以使用QBrush绘制,也可以使用drawBackground(),drawForeground()实现如果使用图片作为背景,可以用texture QBrush(pixmap)实现前景层brush可以使
6、用半透明的白色实现褪色效果,或者使用交叉模式实现网格重叠场景可以告诉我们,哪些图元发生冲突,哪些图元被选择,哪些图元位于一个特定的点或者区域每个图元可以是:1.顶级图元,场景是它的父亲;2.孩子,它的父亲是另一个图元,任何作用于父图元的转换都将自动应用于它的孩子2种分组方式:1.一个图元成为另一个图元的孩子; 2.使用QGraphicsItemGroup。使用分组,可以使位于同一个组的所有图元的操作都相同QGraphicsView:是一个Widget,用于显示一个场景,提供滚动条功能和转换功能,可以缩放和旋转场景。默认使用内建的2D画图引擎,可以使用OpenGL:在构造后,调用setViewp
7、ort()坐标系统:使用3种坐标系统:viewport, scene, itemviewport: 位于QGraphicsView内部scene: 逻辑坐标用于定位顶级图元item: 与图元相关,以图元的(0,0)为中心,移动图元时,它的坐标不会改变实践中,主要关注场景坐标(定位顶级图元)和图元坐标(定位子图元和绘制图元)在图元自己的坐标系统里面绘图意味着我们不用担心它在场景中的位置和应用于它的坐标转换Demo:/ 主要特点:/ 上下文菜单, 右键菜单/ copy-paste方法/diagram.proTEMPLATE = appHEADERS = diagramwindow.h link.h
8、 node.h propertiesdialog.hSOURCES = diagramwindow.cpp link.cpp main.cpp node.cpp propertiesdialog.cppFORMS = propertiesdialog.uiRESOURCES = resources.qrc/link.h#ifndef LINK_H#define LINK_H#include class Node;class Link : public QGraphicsLineItem / 如果使用信号和槽,采用多继承public QObjectpublic:Link(Node *fromNo
9、de, Node *toNode);Link();Node *fromNode() const;Node *toNode() const;void setColor(const QColor &color);QColor color() const;void trackNodes(); / 节点移动时,跟踪节点private:Node *myFromNode; / 连线的2个节点Node *myToNode;#endif/link.cpp#include #include link.h#include node.hLink:Link(Node *fromNode, Node *toNode)m
10、yFromNode = fromNode;myToNode = toNode;myFromNode-addLink(this); / 节点增加连线,每个节点有任意多个连线myToNode-addLink(this);setFlags(QGraphicsItem:ItemIsSelectable); / 连线可以被选择,然后删除setZValue(-1); / 在场景中显示的前后层次,因为连线是两个节点的中心,-1表示位于最后面,/ 节点覆盖了部分连线setColor(Qt:darkRed); / 设置线的颜色trackNodes();Link:Link()myFromNode-removeLi
11、nk(this); / 删除连线时,将删除它在节点中的记录myToNode-removeLink(this);Node *Link:fromNode() constreturn myFromNode;Node *Link:toNode() constreturn myToNode;void Link:setColor(const QColor &color)setPen(QPen(color, 1.0);QColor Link:color() constreturn pen().color();void Link:trackNodes()/ pos()返回节点在场景中或者父图元中的位置setL
12、ine(QLineF(myFromNode-pos(), myToNode-pos();/node.h#ifndef NODE_H#define NODE_H#include #include #include #include class Link;class Node : public QGraphicsItemQ_DECLARE_TR_FUNCTIONS(Node) / 在此类中增加tr()功能,直接使用,而不需要QObject:tr()了public:Node();Node();void setText(const QString &text);QString text() const
13、;void setTextColor(const QColor &color);QColor textColor() const;void setOutlineColor(const QColor &color);QColor outlineColor() const;void setBackgroundColor(const QColor &color);QColor backgroundColor() const;void addLink(Link *link);void removeLink(Link *link);QRectF boundingRect() const; / 重新实现,
14、决定一个图元是否需要绘制,必须的QPainterPath shape() const; / 重新实现,返回图元的精确形状,/ 决定一个点是否在图元内,或者2个图元是否发生冲突void paint(QPainter *painter, / 重新实现,画图, 必须的const QStyleOptionGraphicsItem *option, QWidget *widget);protected:void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); / 双击事件,修改节点的文本QVariant itemChange(Graphic
15、sItemChange change, / 重新实现,图元变化时,相关的连线发生变化const QVariant &value); / 没有使用mouseMoveEvent(), / 是因为程序可以改变节点位置private:QRectF outlineRect() const;int roundness(double size) const;QSet myLinks;QString myText;QColor myTextColor;QColor myBackgroundColor;QColor myOutlineColor;#endif/link.cpp#include #include
16、link.h#include node.hNode:Node()myTextColor = Qt:darkGreen;myOutlineColor = Qt:darkBlue;myBackgroundColor = Qt:white;setFlags(ItemIsMovable | ItemIsSelectable); / 节点可以移动,被选择Node:Node()foreach (Link *link, myLinks) / 删除所有的连线,防止边界效应,不使用aDeleteAll()delete link;void Node:setText(const QString &text)prep
17、areGeometryChange(); / 改变节点内的文本时,矩形可能会发生变化myText = text;update();QString Node:text() constreturn myText;void Node:setTextColor(const QColor &color)myTextColor = color;update();QColor Node:textColor() constreturn myTextColor;void Node:setOutlineColor(const QColor &color)myOutlineColor = color;update(
18、);QColor Node:outlineColor() constreturn myOutlineColor;void Node:setBackgroundColor(const QColor &color)myBackgroundColor = color;update();QColor Node:backgroundColor() constreturn myBackgroundColor;void Node:addLink(Link *link)myLinks.insert(link); / 增加连线时,记录连线void Node:removeLink(Link *link)myLin
19、ks.remove(link);QRectF Node:boundingRect() const / View决定是否绘制矩形const int Margin = 1;return outlineRect().adjusted(-Margin, -Margin, +Margin, +Margin);QPainterPath Node:shape() const / View用于冲突探测QRectF rect = outlineRect();QPainterPath path;path.addRoundRect(rect, roundness(rect.width(),roundness(rec
20、t.height();return path;/ 绘制图元void Node:paint(QPainter *painter,const QStyleOptionGraphicsItem *option,QWidget * /* widget */)QPen pen(myOutlineColor);if (option-state & QStyle:State_Selected) / 图元被选择pen.setStyle(Qt:DotLine);pen.setWidth(2);painter-setPen(pen);painter-setBrush(myBackgroundColor);QRec
21、tF rect = outlineRect();painter-drawRoundRect(rect, roundness(rect.width(),roundness(rect.height();painter-setPen(myTextColor);painter-drawText(rect, Qt:AlignCenter, myText);/ 双击节点,弹出标准输入对话框void Node:mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)QString text = QInputDialog:getText(event-widg
22、et(),tr(Edit Text), tr(Enter new text:),QLineEdit:Normal, myText);if (!text.isEmpty()setText(text);/ 拖动节点时,调用此函数QVariant Node:itemChange(GraphicsItemChange change,const QVariant &value)if (change = ItemPositionHasChanged) foreach (Link *link, myLinks)link-trackNodes();return QGraphicsItem:itemChange
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Qt 学习 笔记 图形 视图 框架 12
限制150内