视图框架坐标解释:
图形项的位置是指图形项的原点在其父图形项或者场景中的位置。
可以使用setPos()函数来指定图形项的位置。如果,没有指定,它默认会出现在父图形项或者场景的原点处。
QGraphicsScene *pScene = new QGraphicsScene;
pScene->setSceneRect(QRectF(-200, -200, 400, 400));
// 创建图元对象
Heart *pHeart = new Heart; // 类Heart从QGraphicsItem继承过来
pHeart->setPos(-100, 0);
// 将图元加入到场景
pScene->addItem(pHeart);
// 创建视图
QGraphicsView *pView = new QGraphicsView;
pView->setScene(pScene);
pView->resize(400, 400);
1. 场景的原点是(0, 0)点
2. pScene->setSceneRect(QRectF(-200, -200, 400, 400));这句设置scene的(-200, -200)点对应view的左上角(0, 0)点,但是只有在场景的矩形大于视口的矩形的时候,才对应视口的左上角(0,0)点。
注意:一般情况下视口和场景设置成一样大小,但是当场景大小小于视图大小的时候,将中心对齐,此中指的仍然是整个图元的中心 同时,图元原点与场景原点对齐,场景左上角顶点与视图原点对齐
3. setPos基于场景坐标系
使用自定义视图框架
一、QGraphicsItem要点 积累
1.在创建QGraphicsItem子类的时候,想要实现自己绘图,一般是重新实现boundingRect()和paint()函数,如果不重新实现shape(),基类的实现将会退而使用 boundingRect()。
2.boundingRect()这个函数的返回值是一个QRectF(一个正方形的区域),当我们需要处理我们所写的MyItem接受到的某些事件(比如鼠标按下、拖动等)时,这些事件就被规定只能发生在这个返回的矩形区域 当中时才会起被接收到。(也就是说你可以在QRectF区域外画图,但是在QRectF区域外画的图,就不会接受到某些事件)
3.函数paint(QPainter*painter,constQStyleOptionGraphicsItem*option,QWidget*/*widget*/)所绘制的内容也只能在这个区域里面画,画我们某一个具体的Item的全部内容。
4.shape()所返回的就是我们所绘制的Item的大概形状。
5.在可能改变QGraphicsItem大小或者形状的时候,QGraphicsItem子类函数中先调用prepareGeometryChange();
二、QGraphicsView用法总结
QGraphicsView用以展示QGraphicsScene对象
QGraphicsView可以展示QGraphicsScene的全部,也可以展示其一部分
QGraphicsScene scene;
scene.addText("Hello, world!");
QGraphicsView view(&scene);
view.show();
设置视图中间点
centerOn();
确保某一点在视图中可见
ensureVisible();
默认视图大小
QGraphicsScene::itemsBoundingRect();
手动设置视图大小
setSceneRect();
设置显示风格
包括:
- 设置显示区大小
- 设置显示提示
QGraphicsScene scene;
scene.addRect(QRectF(-10, -10, 20, 20));
QGraphicsView view(&scene);
view.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
view.show();
改变视图窗口所在的QWidget
QGraphicsView拥有对窗口的所有权
访问QWidget
viewport()
替换QWidget(用OpenGL)
setViewport()
图像变换
旋转、缩放、转化(根据横纵坐标)
rotate(qreal angle);
scale(qreal sx, qreal sy);
translate(qreal dx, qreal dy);
shear(qreal sh, qreal sv);//剪切
键盘、鼠标控制
因为继承了 QGraphicsSceneEvent 类
选中、拖拽视图中的某一项
//响应开关
setInteractive(bool allowed)
自定义控制响应
继承 QGraphicsView
重写鼠标和键盘 事件响应器
Qt提供了 mapToScene() 和 mapFromScene() 用来视图中,点与点,点与区域,区域与区域之间的映射。
三QgraphicsScene类
QgraphicsScene类为管理大量的2D图形item提供了一个管理界面,做为item的容器,它配合使用QgraphicsView使用来观察items,例如线,矩形,文本或者自定义的items,
QgraphicsScene提供了方便的函数来让你高效的找到items的位置,或者决定在scene上哪个item可以看到,配合QgraphicsView窗口,你可以让可见scene,或者缩放场景来可见一部分
例如:
QGraphicsScene scene;
scene.addText("Hello, world!");
QGraphicsView view(&scene);
view.show();
注意:QgraphicsScene场景没有自己可见的外观,他只管理items,需要创建一个QgraphicsView Widget来让场景可见。
添加items到场景中,首先你要构造一个QGraphicsScene对象,然后,你有两个选择: 一是通过addItem函数,一是通过调用方便的函数 addEllipse(), addLine(), addPath(), addPixmap(), addPolygon(), addRect(), or addText(), 将会返回一个新添加的item的指针,添加到场景中的item大小和item本地坐标系统有关,初始化位置在场景中的(0,0)
当场景改变时候,例如转换item或者删除item时候,场景QgrapbhicsScene会发射change()信号,删除item,可以调用removeItem()
QgrapbhicsScene使用下标来高效的管理item的位置,默认的使用BSP树,适用于一个大型的场景,其中的item都是静止不变的,可以选择调用setItemIndexMethod().来禁用下标,可是查看itemIndexMethod来获取更多的信息
场景的边界可以使用setSceneRect()来设置,item可以放置在场景中任何位置,场景默认的大小是不受限制的,场景的矩形只用来做内部的簿记,管理场景中的item下标,如果场景矩形没有设置,QgrapbhicsScene将会使用所有item图元的边界,使用函数itemsBoundingRect()返回
QgrapbhicsScene一个巨大的功能是他可以高效的找到items的位置,即便是场景中有上百万个item,items()函数可以在数微秒内找到item的位置,items()有一些重载函数(省略)
ItemAt()函数可以根据提供的位置返回所在位置处的最上层的item
QgrapbhicsScene包含了场景的选择信息,选择items,可以使用setSelectionArea(),清除当前选择可以使用clearSelection(),调用selectedItems()来获取已经选择的items
事件处理和传播
QgrapbhicsScene另外一个责任是传播从QgraphicsView来的事件,发送事件给场景scene,可以继承QEvent构建一个事件,然后使用QApplication::sendEvent()来传递,event()函数负责分发给各个独立的items,一些普通的事件可以使用方便的事件处理函数,例如keyPressEvent()和mousePressEvent()
键盘事件发送给当前选择的item,设置选择的item,可调用setFocusItem(),将要选择的item作为参数传递进去,或者item自己调用函数QgraphicsItem::setFocus(),调用focusItem()来获取当前的选择的item,为了窗口的兼容性,场景也获取它自己的获取光标的信息,默认的,场景没有焦点,键盘事件也被忽略,如果函数setFocus()调用了,或者场景中一个item图元获得了焦点,场景也自动的获得了焦点,然后场景的hasFocus()函数返回真,键盘事件将会发送给选择的那个item,当场景丢失了focus,但是其中的item获得了焦点,那么这个场景也将获得这个item的焦点信息,如果场景要重新获取焦点,它将会把上次获得焦点的item重新获得item
对于鼠标移动效果,QgrapbhicsScene传递鼠标悬浮事件,如果其中的item设置了接受QGraphicsItem::acceptHoverEvents()事件(默认是忽略该事件的),它将会收到GraphicsSceneHoverEnter事件,GraphicsSceneHoverMove,GraphicsSceneHoverLeave事件
所有的鼠标事件都传送给当前鼠标拖动的那个item,当然也要item设置接受鼠标事件,看QGraphicsItem::acceptedMouseButtons(),
可以调用QGraphicsItem * QGraphicsScene::mouseGrabberItem () const来查看当前选择的item,该函数会返回选择的item的指针。
,
1、QGraphicsScene::setItemIndexMethod ( ItemIndexMethod method )
用来设置场景中item的下标的方法,QGraphicsScene对场景应用一个index算法,来加速查询item,例如items()和itemAt(),下标对于静态的场景很有用,对动态的场景,或者场景中有很多动画项目(animated items),使用下标来寻找item就不行了
一般情况下,默认的下标使用BSP树就能很好的工作,如果你的场景中使用了很多动画,可以禁用下标通过调用setItemIndexMethod(QGraphicsScene::NoIndexNoIndex)
2、QGraphicsScene::setSceneRect(const QRectF & rect)
用来设置场景的矩形区域,限定场景的边界
这个矩形限定了场景的范围,它首先使用QGraphicsView来确定试图的可卷动区域,使用QGraphicsScene来管理item下标
如果不设定矩形区域,或者设置一个空的矩形,QRect QGraphicsScene::FsceneRect() const会返回最大的边界,场景中所有的item都会被创建。
图形项的位置是指图形项的原点在其父图形项或者场景中的位置。
可以使用setPos()函数来指定图形项的位置。如果,没有指定,它默认会出现在父图形项或者场景的原点处。
QGraphicsScene *pScene = new QGraphicsScene;
pScene->setSceneRect(QRectF(-200, -200, 400, 400));
// 创建图元对象
Heart *pHeart = new Heart; // 类Heart从QGraphicsItem继承过来
pHeart->setPos(-100, 0);
// 将图元加入到场景
pScene->addItem(pHeart);
// 创建视图
QGraphicsView *pView = new QGraphicsView;
pView->setScene(pScene);
pView->resize(400, 400);
1. 场景的原点是(0, 0)点
2. pScene->setSceneRect(QRectF(-200, -200, 400, 400));这句设置scene的(-200, -200)点对应view的左上角(0, 0)点,但是只有在场景的矩形大于视口的矩形的时候,才对应视口的左上角(0,0)点。
注意:一般情况下视口和场景设置成一样大小,但是当场景大小小于视图大小的时候,将中心对齐,此中指的仍然是整个图元的中心 同时,图元原点与场景原点对齐,场景左上角顶点与视图原点对齐
3. setPos基于场景坐标系
使用自定义视图框架
一、QGraphicsItem要点 积累
1.在创建QGraphicsItem子类的时候,想要实现自己绘图,一般是重新实现boundingRect()和paint()函数,如果不重新实现shape(),基类的实现将会退而使用 boundingRect()。
2.boundingRect()这个函数的返回值是一个QRectF(一个正方形的区域),当我们需要处理我们所写的MyItem接受到的某些事件(比如鼠标按下、拖动等)时,这些事件就被规定只能发生在这个返回的矩形区域 当中时才会起被接收到。(也就是说你可以在QRectF区域外画图,但是在QRectF区域外画的图,就不会接受到某些事件)
3.函数paint(QPainter*painter,constQStyleOptionGraphicsItem*option,QWidget*/*widget*/)所绘制的内容也只能在这个区域里面画,画我们某一个具体的Item的全部内容。
4.shape()所返回的就是我们所绘制的Item的大概形状。
5.在可能改变QGraphicsItem大小或者形状的时候,QGraphicsItem子类函数中先调用prepareGeometryChange();
二、QGraphicsView用法总结
QGraphicsView用以展示QGraphicsScene对象
QGraphicsView可以展示QGraphicsScene的全部,也可以展示其一部分
QGraphicsScene scene;
scene.addText("Hello, world!");
QGraphicsView view(&scene);
view.show();
设置视图中间点
centerOn();
确保某一点在视图中可见
ensureVisible();
默认视图大小
QGraphicsScene::itemsBoundingRect();
手动设置视图大小
setSceneRect();
设置显示风格
包括:
- 设置显示区大小
- 设置显示提示
QGraphicsScene scene;
scene.addRect(QRectF(-10, -10, 20, 20));
QGraphicsView view(&scene);
view.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
view.show();
改变视图窗口所在的QWidget
QGraphicsView拥有对窗口的所有权
访问QWidget
viewport()
替换QWidget(用OpenGL)
setViewport()
图像变换
旋转、缩放、转化(根据横纵坐标)
rotate(qreal angle);
scale(qreal sx, qreal sy);
translate(qreal dx, qreal dy);
shear(qreal sh, qreal sv);//剪切
键盘、鼠标控制
因为继承了 QGraphicsSceneEvent 类
选中、拖拽视图中的某一项
//响应开关
setInteractive(bool allowed)
自定义控制响应
继承 QGraphicsView
重写鼠标和键盘 事件响应器
Qt提供了 mapToScene() 和 mapFromScene() 用来视图中,点与点,点与区域,区域与区域之间的映射。
三QgraphicsScene类
QgraphicsScene类为管理大量的2D图形item提供了一个管理界面,做为item的容器,它配合使用QgraphicsView使用来观察items,例如线,矩形,文本或者自定义的items,
QgraphicsScene提供了方便的函数来让你高效的找到items的位置,或者决定在scene上哪个item可以看到,配合QgraphicsView窗口,你可以让可见scene,或者缩放场景来可见一部分
例如:
QGraphicsScene scene;
scene.addText("Hello, world!");
QGraphicsView view(&scene);
view.show();
注意:QgraphicsScene场景没有自己可见的外观,他只管理items,需要创建一个QgraphicsView Widget来让场景可见。
添加items到场景中,首先你要构造一个QGraphicsScene对象,然后,你有两个选择: 一是通过addItem函数,一是通过调用方便的函数 addEllipse(), addLine(), addPath(), addPixmap(), addPolygon(), addRect(), or addText(), 将会返回一个新添加的item的指针,添加到场景中的item大小和item本地坐标系统有关,初始化位置在场景中的(0,0)
当场景改变时候,例如转换item或者删除item时候,场景QgrapbhicsScene会发射change()信号,删除item,可以调用removeItem()
QgrapbhicsScene使用下标来高效的管理item的位置,默认的使用BSP树,适用于一个大型的场景,其中的item都是静止不变的,可以选择调用setItemIndexMethod().来禁用下标,可是查看itemIndexMethod来获取更多的信息
场景的边界可以使用setSceneRect()来设置,item可以放置在场景中任何位置,场景默认的大小是不受限制的,场景的矩形只用来做内部的簿记,管理场景中的item下标,如果场景矩形没有设置,QgrapbhicsScene将会使用所有item图元的边界,使用函数itemsBoundingRect()返回
QgrapbhicsScene一个巨大的功能是他可以高效的找到items的位置,即便是场景中有上百万个item,items()函数可以在数微秒内找到item的位置,items()有一些重载函数(省略)
ItemAt()函数可以根据提供的位置返回所在位置处的最上层的item
QgrapbhicsScene包含了场景的选择信息,选择items,可以使用setSelectionArea(),清除当前选择可以使用clearSelection(),调用selectedItems()来获取已经选择的items
事件处理和传播
QgrapbhicsScene另外一个责任是传播从QgraphicsView来的事件,发送事件给场景scene,可以继承QEvent构建一个事件,然后使用QApplication::sendEvent()来传递,event()函数负责分发给各个独立的items,一些普通的事件可以使用方便的事件处理函数,例如keyPressEvent()和mousePressEvent()
键盘事件发送给当前选择的item,设置选择的item,可调用setFocusItem(),将要选择的item作为参数传递进去,或者item自己调用函数QgraphicsItem::setFocus(),调用focusItem()来获取当前的选择的item,为了窗口的兼容性,场景也获取它自己的获取光标的信息,默认的,场景没有焦点,键盘事件也被忽略,如果函数setFocus()调用了,或者场景中一个item图元获得了焦点,场景也自动的获得了焦点,然后场景的hasFocus()函数返回真,键盘事件将会发送给选择的那个item,当场景丢失了focus,但是其中的item获得了焦点,那么这个场景也将获得这个item的焦点信息,如果场景要重新获取焦点,它将会把上次获得焦点的item重新获得item
对于鼠标移动效果,QgrapbhicsScene传递鼠标悬浮事件,如果其中的item设置了接受QGraphicsItem::acceptHoverEvents()事件(默认是忽略该事件的),它将会收到GraphicsSceneHoverEnter事件,GraphicsSceneHoverMove,GraphicsSceneHoverLeave事件
所有的鼠标事件都传送给当前鼠标拖动的那个item,当然也要item设置接受鼠标事件,看QGraphicsItem::acceptedMouseButtons(),
可以调用QGraphicsItem * QGraphicsScene::mouseGrabberItem () const来查看当前选择的item,该函数会返回选择的item的指针。
,
1、QGraphicsScene::setItemIndexMethod ( ItemIndexMethod method )
用来设置场景中item的下标的方法,QGraphicsScene对场景应用一个index算法,来加速查询item,例如items()和itemAt(),下标对于静态的场景很有用,对动态的场景,或者场景中有很多动画项目(animated items),使用下标来寻找item就不行了
一般情况下,默认的下标使用BSP树就能很好的工作,如果你的场景中使用了很多动画,可以禁用下标通过调用setItemIndexMethod(QGraphicsScene::NoIndexNoIndex)
2、QGraphicsScene::setSceneRect(const QRectF & rect)
用来设置场景的矩形区域,限定场景的边界
这个矩形限定了场景的范围,它首先使用QGraphicsView来确定试图的可卷动区域,使用QGraphicsScene来管理item下标
如果不设定矩形区域,或者设置一个空的矩形,QRect QGraphicsScene::FsceneRect() const会返回最大的边界,场景中所有的item都会被创建。