精华内容
下载资源
问答
  • Qt 之图形视图框架

    万次阅读 多人点赞 2016-07-20 16:59:13
    简述图形视图(Graphics View)提供了一个用于管理和交互大量自定义的二维图形对象(Item),以及一个支持缩放和旋转操作的视图部件用于显示这些视图项。框架包括一个事件传播架构,支持scene中的items进行精确的双...

    简述

    图形视图(Graphics View)提供了一个平台,用于大量自定义2D图元的管理与交互,并提供了一个视图部件(view widget)来显示可以缩放和旋转的图元。

    框架包括一个事件传播架构,支持场景(Scene)中的图元(Item)进行精确的双精度交互功能。图元可以处理键盘事件、鼠标按下、移动、释放和双击事件,同时也能跟踪鼠标移动。

    图形视图使用一个BSP(Binary Space Partitioning - 二叉空间分割)树,以提供对图形元素的快速查找,正因为如此,它可以使超大的场景实时地可视化,即使包含数百万的图元。

    | 版权声明:一去、二三里,未经博主允许不得转载。

    图形视图架构

    图形视图提供了一个基于图元的方式来实现模型视图(model-view)编程,很像InterView中的便利类:QTableView、QTreeView和QListView。多个视图可以观察一个单独的场景,场景则包含了不同的几何形状图元 。

    场景

    QGraphicsScene提供了图形视图场景。

    场景有以下职责:

    • 提供一个快速的接口,用于管理大量图元
    • 向每个图元传递事件
    • 管理图元的状态,如:选中、焦点处理
    • 提供未进行坐标转换的渲染功能,主要用于打印

    场景是QGraphicsItem对象的容器。调用QG

    展开全文
  • Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰效果 Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、...
  • 图形视图框架

    千次阅读 2017-12-19 11:30:33
    图形视图(Graphics View)提供了一个平台,用于大量自定义2D图元的管理与交互,并提供了一个视图部件(view widget)来显示可以缩放和旋转的图元。 框架包括一个事件传播架构,支持场景(Scene)中的图元(Item)...

    简述

    图形视图(Graphics View)提供了一个平台,用于大量自定义2D图元的管理与交互,并提供了一个视图部件(view widget)来显示可以缩放和旋转的图元。

    框架包括一个事件传播架构,支持场景(Scene)中的图元(Item)进行精确的双精度交互功能。图元可以处理键盘事件、鼠标按下、移动、释放和双击事件,同时也能跟踪鼠标移动。

    图形视图使用一个BSP(Binary Space Partitioning - 二叉空间分割)树,以提供对图形元素的快速查找,正因为如此,它可以使超大的场景实时地可视化,即使包含数百万的图元。

    图形视图架构

    图形视图提供了一个基于图元的方式来实现模型视图(model-view)编程,很像InterView中的便利类:QTableView、QTreeView和QListView。多个视图可以观察一个单独的场景,场景则包含了不同的几何形状图元 。

    场景

    QGraphicsScene提供了图形视图场景。

    场景有以下职责:

    • 提供一个快速的接口,用于管理大量图元
    • 向每个图元传递事件
    • 管理图元的状态,如:选中、焦点处理
    • 提供未进行坐标转换的渲染功能,主要用于打印

    场景是QGraphicsItem对象的容器。调用QGraphicsScene::addItem()将图元添加到场景中后,你就可以通过调用场景中的不同的查找函数来查找其中的图元。QGraphicsScene::items()函数及其重载函数可以返回所有图元,包括:点、矩形、多边形、通用矢量路径。

    QGraphicsScene::itemAt()返回在特定点上最上面的图元。所有找到的图元按照层叠递减的排列顺序(即:最先返回的图元是最顶层的,最后返回的则是最底层的)。

    QGraphicsScene scene;
    QGraphicsRectItem *rect = scene.addRect(QRectF(0, 0, 100, 100));
    
    QGraphicsItem *item = scene.itemAt(50, 50);
    // item == rect
     
    • 1
    • 2
    • 3
    • 4
    • 5

    QGraphicsScene的事件传递机制负责将场景事件传递给图元,同时也管理图元之间的传递。如果场景在某个位置得到一个鼠标按下事件,就将该事件传递给这个位置上的图元。

    QGraphicsScene同时还管理某些图元的状态,例如:图元的选中和焦点。可以通过调用QGraphicsScene::setSelectionArea(),传递一个任意形状,来选中场景中的图元。此功能也被用于QGraphicsView中橡皮筋(rubberband)选中的基础。通过调用QGraphicsScene::selectedItems()可以获取当前选中的图元列表。另外一种由QGraphicsScene处理的状态是:一个图元是否有键盘输入焦点。你可以调用QGraphicsScene::setFocusItem()或QGraphicsItem::setFocus()为一个图元设置焦点,或通过QGraphicsScene::focusItem()获取当前的焦点图元。

    最后,QGraphicsScene允许通过QGraphicsScene::render()将部分场景绘制到绘图设备(paint device - 例如:QImage、QPrinter、QWidget)上。可以在本文关于“打印”部分了解更多细节。

    视图

    QGraphicsView提供了视图部件,将一个场景中的内容显示出来。你可以附加多个视图到同一个场景,从而针对同一数据集提供几个视口(viewport)。该视图部件是一个滚动区域(scroll area),为大型场景浏览提供滚动条。如果要启用OpenGL支持,可通过调用QGraphicsView::setViewport(),将一个QGLWidget设置为视口。

    QGraphicsScene scene;
    myPopulateScene(&scene);
    
    QGraphicsView view(&scene);
    view.show();
     
    • 1
    • 2
    • 3
    • 4
    • 5

    视图通过键盘和鼠标接收输入事件,并在事件发送给可视化的场景之前,将它们转换成场景事件(将坐标转化为适当的场景坐标)。

    利用变换矩阵QGraphicsView::transform(),视图可以转换场景的坐标系,以便实现高级查看功能,例如:缩放、旋转。为方便起见,QGraphicsView也提供了视图和场景坐标之间转换函数:QGraphicsView::mapToScene()和QGraphicsView::mapFromScene()。

    这里写图片描述

    图元

    QGraphicsItem是场景中图元的基类。图形视图提供了一些典型形状的标准图元,例如:矩形 ( QGraphicsRectItem )、椭圆 ( QGraphicsEllipseItem ) 、文本项 ( QGraphicsTextItem )。但当你自定义图元时,QGraphicsItem强大的特性就体现出来了。除此之外,QGraphicsItem还支持以下特性:

    • 鼠标按下、移动、释放和双击事件,以及鼠标悬浮事件、滚轮事件和上下文菜单事件。
    • 键盘输入焦点和键盘事件。
    • 拖放。
    • 分组:通过父子关系,或QGraphicsItemGroup。
    • 碰撞检测。

    和QGraphicsView一样,处于局部坐标系下的图元,也提供了很多函数用于图元和场景之间、图元到图元的坐标映射。此外,和QGraphicsView一样,它可以通过一个矩阵(matrix):QGraphicsItem::transform()来转换其自身的坐标系,这对于旋转和缩放单个图元非常有用。

    这里写图片描述

    图形视图框架中的类

    这些类提供了一种创建交互式应用程序的框架。

    描述
    QAbstractGraphicsShapeItem 所有路径图元的共同基类
    QGraphicsAnchor 表示一个QGraphicsAnchorLayout中两个图元之间的anchor
    QGraphicsAnchorLayout 布局可以anchor部件到图形视图中
    QGraphicsEffect 所有图形特效的基类
    QGraphicsEllipseItem 可以添加到QGraphicsScene的椭圆图元
    QGraphicsGridLayout 图形视图中管理部件的网格布局
    QGraphicsItem QGraphicsScene中所有图元的基类
    QGraphicsItemGroup 一个将图元组当做单个图元来看待的容器
    QGraphicsLayout 图形视图中所有布局类的基类
    QGraphicsLayoutItem 可以被继承,允许布局类管理的自定义图元
    QGraphicsLineItem 可以添加到QGraphicsScene的直线图元
    QGraphicsLinearLayout 图形视图中管理部件的水平或垂直布局
    QGraphicsObject 所有需要信号、槽、属性的图元的基类
    QGraphicsPathItem 可以添加到QGraphicsScene的路径图元
    QGraphicsPixmapItem 可以添加到QGraphicsScene的图形图元
    QGraphicsPolygonItem 可以添加到QGraphicsScene的多边形图元
    QGraphicsProxyWidget 代理,用于将一个QWidget对象嵌入到QGraphicsScene中
    QGraphicsRectItem 可以添加到QGraphicsScene的矩形图元
    QGraphicsScene 管理大量2D图元的管理器
    QGraphicsSceneContextMenuEvent 图形视图框架中的上下文菜单事件
    QGraphicsSceneDragDropEvent 图形视图框架中的拖放事件
    QGraphicsSceneEvent 所有图形视图相关事件的基类
    QGraphicsSceneHelpEvent Tooltip请求时的事件
    QGraphicsSceneHoverEvent 图形视图框架中的悬停事件
    QGraphicsSceneMouseEvent 图形视图框架中的鼠标事件
    QGraphicsSceneMoveEvent 图形视图框架中的部件移动事件
    QGraphicsSceneResizeEvent 图形视图框架中的部件大小改变事件
    QGraphicsSceneWheelEvent 图形视图框架中的鼠标滚轮事件
    QGraphicsSimpleTextItem 可以添加到QGraphicsScene的简单文本图元
    QGraphicsSvgItem 可以用来呈现SVG文件内容的QGraphicsItem
    QGraphicsTextItem 可以添加到QGraphicsScene的文本图元,用于显示格式化文本
    QGraphicsTransform 创建QGraphicsItems高级矩阵变换的抽象基类
    QGraphicsView 显示一个QGraphicsScene内容的部件
    QGraphicsWidget QGraphicsScene中所有部件图元的基类
    QStyleOptionGraphicsItem 用于描述绘制一个QGraphicsItem所需的参数

    图形视图坐标系

    图形视图基于笛卡儿坐标系,场景中图元的位置和几何形状由两组数据来表示:X坐标和Y坐标。当使用一个未转换的视图来观察一个场景,场景中的一个单元将会由场景上的一个像素表示。

    注意 :图形视图使用了Qt的坐标系,不支持反转的Y轴坐标系(即Y向上为正方向)。

    图形视图中使用了三种有效的坐标系:图元坐标、场景坐标、视图坐标。为了简化实现,图形视图提供了非常方便的函数来进行三个坐标系的映射。

    渲染时,图形视图的场景坐标对应于QPainter的逻辑坐标,视图坐标与设备坐标一致。参考:Coordinate System,了解更多关于逻辑坐标和设备坐标关系的内容。

    这里写图片描述

    图元坐标

    图元生活在自己的局部坐标系。它们的坐标通常围绕它们的中心点(0, 0),并且这也是所有转换的中心。图元坐标系下的几何元素通常指点、线或矩形。

    创建自定义图元时,只需考虑图元坐标即可。QGraphicsScene和QGraphicsView会为你实现所有相关的转换,这样一来,实现自定义图元就容易多了。例如:当你接收到鼠标按下或拖拽事件时,事件位置将由图元坐标给出。如果某一点(传递一个图元坐标作为参数)在图元中,那么GraphicsItem::contains()虚函数将会返回true;否则,返回false。同样的,项绑定的矩形或形状区域也是项坐标系统的。同样的,图元的矩形边界和形状都是基于图元坐标的。

    图元的位置是图元的中心点在其父坐标系下的坐标,有时也被称为父坐标。场景从这个意义上说是所有无父图元的“parent”,顶层图元的位置在场景坐标中。

    子坐标是相对于父坐标而言的。如果子坐标没有转换,那么子坐标和父坐标的差异就和图元在父坐标中的距离一样。例如:一个未经转换的子图元正好位于父图元的中心点,那么,这两个图元的坐标系是完全一样的。如果子图元的位置是(10, 0),那么子图元的(0, 10)点就对应父图元的(10, 10)点位置。

    由于图元的位置和转换是相对于父图元来说的,因此,虽然父图元的转换隐式地转换了子图元,但是子图元的坐标不会因父图元的转换而受到影响。在上述示例中,即使父图元经过了旋转和缩放,子图元的(0, 10)点始终对应父图元的(10, 10)点。不过相对于场景来说,子图元将随着父图元进行转换和偏移 。如果父图元缩放了(2x, 2x),那么子图元在场景中的坐标是(20, 0),并且其(10, 0)点将会对应于场景中的(40, 0)点。

    不管图元或父图元进行了怎样的转换,QGraphicsItem的函数操作都在图元坐标内。例如:一个图元的矩形边界(QGraphicsItem::boundingRect())总是在图元坐标下给出。但是QGraphicsItem::pos()是例外之一,该函数表示其在父图元中的位置 。

    场景坐标

    场景为所有的图元提供了基础的坐标系。场景坐标系描述了每一个顶层图元的位置,同时构成了从视图传递到场景的所有场景事件的基础。场景中的每个图元都有一个场景位置和矩形边界(QGraphicsItem::scenePos()、QGraphicsItem::sceneBoundingRect());另外,也有其自身的位置和矩形边界。场景位置描述了图元在场景坐标下内的位置,场景矩形边界则提供给QGraphicsScene来决定场景中的哪块区域已经被改变了。场景中的变化通过QGraphicsScene::changed()信号发出,参数是场景矩形列表。

    视图坐标

    视图坐标是部件的坐标,视图坐标中的每个单位对应一个像素。对于该坐标系来说比较特殊的一点是:它相对于部件或视口,不会受被观察的场景所影响。QGraphicsView的视口左上角总是(0, 0),右下角总是(viewport width, viewport height)。所有的鼠标事件和拖拽事件都以视图坐标接收到的,你需要将这些坐标映射到场景,以便于和图元进行交互。

    坐标映射

    通常处理场景中的图元时,从场景到图元、从图元到图元、从视图到场景的坐标或任意形状转换将会非常有用。例如:当在QGraphicsView视口中点击鼠标,你可以向场景询问当前鼠标下方的是什么图元(调用 QGraphicsView::mapToScene()转换坐标,然后通过QGraphicsScene::itemAt()查询图元)。如果想知道一个图元处于视口中的位置,可以调用图元的函数QGraphicsItem::mapToScene(),然后再调用视图的函数QGraphicsView::mapFromScene()。最后,如果想查找位于一个椭圆区域内的图元,你可以把一个QPainterPath传递给mapToScene(),然后将转换后的path传递给QGraphicsScene::items()。

    通过调用QGraphicsItem::mapToScene()将坐标或任意形状映射到图元的场景中去,而调用QGraphicsItem::mapFromScene()将其映射回来;通过调用QGraphicsItem::mapToParent()将图元映射到父图元,而调用QGraphicsItem::mapFromParent()将其映射回来;甚至可以调用QGraphicsItem::mapToItem()和QGraphicsItem::mapFromItem()在不同的图元间进行映射。所有的映射函数均支持点、矩形、多边形和路径。

    在视图和场景之间也存在着同样的映射函数:QGraphicsView::mapFromScene()和QGraphicsView::mapToScene()。要从视图映射到图元,第一步是映射到场景,然后才能从场景映射到图元。

    主要特点

    缩放和旋转

    和QPainter一样,QGraphicsView也可以通过QGraphicsView::setMatrix()支持仿射转换。通过将转换应用到视图上,可以很轻松地添加对普通浏览的支持,例如:缩放和旋转。

    下面的示例,说明了如何通过QGraphicsView子类来实现旋转和缩放:

    class View : public QGraphicsView
    {
    Q_OBJECT
        ...
    public slots:
        void zoomIn() { scale(1.2, 1.2); }
        void zoomOut() { scale(1 / 1.2, 1 / 1.2); }
        void rotateLeft() { rotate(-10); }
        void rotateRight() { rotate(10); }
        ...
    };
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    槽可以关联到启用了“autoRepeat”属性的QToolButtons。

    在转换视图过程中,QGraphicsView始终保持与视图中心对齐。

    参考:Elastic Nodes Example,了解更多关于缩放的内容。

    打印

    图形视图通过其渲染函数QGraphicsScene::render()和QGraphicsView::render(),提供了非常简单的打印功能。

    这两个函数提供了相同的API:只需要将QPainter传给绘制函数,就可以将场景或视图的全部或部分内容渲染到任何绘图设备上。

    下面的示例展示了如何利用QPrinter将整个场景打印到整页上:

    QGraphicsScene scene;
    scene.addRect(QRectF(0, 0, 100, 200), QPen(Qt::black), QBrush(Qt::green));
    
    QPrinter printer;
    if (QPrintDialog(&printer).exec() == QDialog::Accepted) {
        QPainter painter(&printer);
        painter.setRenderHint(QPainter::Antialiasing);
        scene.render(&painter);
    }
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    场景和视图绘制函数的区别在于:前者操作的是场景坐标,后者操作的则是视图坐标。QGraphicsScene::render()多用于打印一个未转换的场景各部分,例如:打印几何数据图表或文本文档。 QGraphicsView::render()则比较适合用于抓取屏幕截图,其缺省行为是使用提供的painter来渲染视口中确切的内容。

    QGraphicsScene scene;
    scene.addRect(QRectF(0, 0, 100, 200), QPen(Qt::black), QBrush(Qt::green));
    
    QPixmap pixmap;
    QPainter painter(&pixmap);
    painter.setRenderHint(QPainter::Antialiasing);
    scene.render(&painter);
    painter.end();
    
    pixmap.save("scene.png");
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    当源区域和目标区域的大小不匹配时,源区域内容将会被缩放来适应目标区域。通过传递Qt::AspectRatioMode参数给你使用的渲染函数,在内容被缩放时,可以选择保持或忽略场景的纵横比。

    拖放

    由于QGraphicsView间接继承了QWidget,因此QGraphicsView也提供了和QWidget一样的拖放功能。此外,为方便起见,图形视图框架为场景、每个图元提供了拖放支持。当视图接收到一个拖拽动作,它将拖放事件转换为一个QGraphicsSceneDragDropEvent,然后将其转发给场景。场景则会接管该事件的调度,并将其发送给鼠标下面第一个接受放下动作的图元。

    要拖拽一个图元,只需要创建一个QDrag对象,将指针传给开始拖拽的部件。图元可以同时被多个视图观察,但是只有一个视图可以进行拖拽。在大多数情况下,拖拽都从鼠标按下或移动开始,因此在 mousePressEvent()或mouseMoveEvent()事件中,你可以从事件中拿到原始的部件指针,例如:

    void CustomItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
    {
        QMimeData *data = new QMimeData;
        data->setColor(Qt::green);
    
        QDrag *drag = new QDrag(event->widget());
        drag->setMimeData(data);
        drag->start();
    }
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    要拦截场景中的拖放事件,需要实现QGraphicsScene::dragEnterEvent(),选择你需要处理的事件,然后进行相应处理即可。你可以到 QGraphicsScene的文章中查看更多关于拖放的内容。

    图元通过调用QGraphicsItem::setAcceptDrops()来启用对拖放的支持;如果要处理拖动,需要实现 QGraphicsItem::dragEnterEvent()、QGraphicsItem::dragMoveEvent()、QGraphicsItem::dragLeaveEvent()、QGraphicsItem::dropEvent(),这几个事件。

    参考:Drag and Drop Robot example,了解更多关于图形视图拖拽的内容。

    光标和tooltip

    和QWidget一样,QGraphicsItem也支持设置光标(QGraphicsItem::setCursor())和tooltip(QGraphicsItem::setToolTip())。当鼠标光标进入item区域(由QGraphicsItem::contains()检测)时,光标和tooltip就会被QGraphicsView激活。

    你也可以通过调用QGraphicsView::setCursor(),直接为视图设置一个默认的光标。

    参考:Drag and Drop Robot example,了解更多关于tooltip和光标形状操作的内容。

    动画

    图形视图在几个层面上提供了对动画的支持。你可以用Animation Framework轻松地设置动画:只需要让你的图元从QGraphicsObject继承,然后将QPropertyAnimation绑定到上面。QPropertyAnimation可以为任何QObject属性实现动画效果。

    另外一个选择是:创建一个自定义图元,从QObject和QGraphicsItem继承。该图元可以设置自己的定时器,然后在QObject::timerEvent()中控制动画。

    第三个选择仅限于与Qt3中的QCanvas兼容。调用QGraphicsScene::advance()从而会依次调用 QGraphicsItem::advance()。

    OpenGL渲染

    要启用OpenGL渲染,只要简单地调用QGraphicsView::setViewport()来设置一个新的QGLWidget作为QGraphicsView的视口。如果你希望OpenGL具有反锯齿,则需要OpenGL支持采样缓冲(参考:QGLFormat::sampleBuffers())。

    示例:

    QGraphicsView view(&scene);
    view.setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
     
    • 1
    • 2

    图元组

    通过将一个图元设置为另一个图元的子图元,就可以得到图元组最重要的功能:图元会一起移动,所有转换都会从父图元传播到子图元中。

    此外,QGraphicsItemGroup是一个特殊的图元,它提供了对子图元事件的支持,同时还提供了用于添加和删除子图元的接口。将一个图元添加到QGraphicsItemGroup将保持图元原始的位置和坐标转换,不过重新设置图元的父图元则会导致图元重新定位到相对于父图元的位置。为了方便起见,你可以调用QGraphicsScene::createItemGroup()来创建QGraphicsItemGroup图元。

    部件和布局

    Qt4.4通过QGraphicsWidget引入了对几何体和对布局敏感的图元的支持。这一特殊的基类图元和QWidget类似,但是不像QWidget,它没有从QPaintDevice继承,而是从QGraphicsItem。这样就允许你完全实现能够处理事件、信号与槽、大小调整和策略的部件,同时你还可以通过QGraphicsLinearLayout和QGraphicsGridLayout来管理部件的几何元素。

    QGraphicsWidget

    QGraphicsWidget建立在QGraphicsItem之上,具有QGraphicsItem的所有功能,保持了较小的资源占用,同时提供了两者的优势:来自QWidget的额外的功能,例如:样式、字体、调色板、布局、几何形状,来自QGraphicsItem的分辨率独立性和坐标转换的支持。由于图形视图使用真实的坐标而不是整数,因此 QGraphicsWidget的几何形状函数可以同时操作QRectF和QPointF。同时也能应用到边框的大小、边距和间距上,例如:对于QGraphicsWidget,规定内容边距为(0.5, 0.5, 0.5, 0.5)是非常常见的。例如:你可以创建子部件,甚至是“顶级”窗口。在某些情况下,你甚至可以将图形视图用于高级多文档界面的应用程序。

    QGraphicsWidget支持部分QWidget属性,包括窗口标志位(window flags)和属性,但是并非全部支持。可以参考QGraphicsWidget文档,以获取完整列表来判断哪些支持以及哪些不支持。例如:你可以在创建QGraphicsWidget时赋予Qt::Window标志,从而得到封装的窗口,但是图形视图目标并不支持 Qt::Sheet和Qt::Drawer标志,这两者在Mac Os X上非常常见。

    QGraphicsLayout

    QGraphicsLayout是第二代布局框架的内容之一,专门为QGraphicsWidget设计。其API和QLayout非常相似。你可以在QGraphicsLinearLayout或QGraphicsGridLayout中对部件或者子布局进行管理,也可以通过派生QGraphicsLayout实现你自己的布局类,还可以通过派生QGraphicsLayoutItem来实现你自己的适配器,从而将QGraphicsItem图元加入到布局中。

    嵌入式部件支持

    图形视图对将任何部件嵌入到场景中提供无缝的支持。你可以嵌入简单的部件,例如:QLineEdit或QPushButton,也可以是复杂的部件,例如:QTabWidget,甚至是完整的主窗口。要将部件嵌入场景中,只需要简单地调用QGraphicsScene::addWidget()或者创建一个QGraphicsProxyWidget对象并将部件手工的嵌入其中。

    通过QGraphicsProxyWidget图形视图能够完全继承客户端部件特性,包括:它的鼠标光标、tooltip、鼠标事件、平板电和键盘事件、子窗口、动画、弹出(例如:QComboBox或QCompleter),以及部件的输入焦点和激活状态。QGraphicsProxyWidget甚至集成了嵌入式部件的tab切换顺序,这样你就可以通过tab键让焦点进入或者移出嵌入式部件。你甚至可以嵌入一个新的 QGraphicsView到你的场景中,从而提供复杂的嵌套的视图。

    当改变一个嵌入式部件,图形视图可以确保部件转换时与分辨率无关,当放大时使字体和样式看起来干净利落。(注意:分辨率无关的效果取决于风格。)

    性能

    浮点指令

    为了精确和快速的将坐标转换和特效应用到图元上,图形视图在编译的时候默认用户的硬件能够为浮点指令提供合理的性能。

    很多工作站和桌面电脑都配备了适当的硬件来加速这种类型的计算,但是一些嵌入式设备可能仅仅提供了处理数学运算的库,或者需要用软件来模拟浮点指令。

    这样,在某些设备上,某些类型的特效可能要比预期的慢。有可能可以在其它方面进行优化来弥补性能上的损失,例如:用OpenGL来绘制场景。不过,如果优化本身是依赖于浮点计算硬件的话,可能都会带来性能上的损失。

    展开全文
  • 本代码演示了各种三维变换算法,包括:几何变换:平移、旋转、变比、对称、错切...投影变换:平行投影(三视图、正轴测图、斜轴测图)、透视图。。源代码可以在VC++6.0中编译通过。 关键字:三维变换,几何变换,投影变换
  • 图形视图框架(The Graphic View Framework)用于管理和与大量定制的二维图形项目交互,以及用于可视化项目的视图小部件,支持缩放和旋转。

    若该文为原创文章,转载请注明原文出处
    本文章博客地址:https://blog.csdn.net/qq21497936/article/details/115791408

    长期持续带来更多项目与技术分享,咨询请加QQ:21497936、微信:yangsir198808

    各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究

    红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

    Qt开发专栏:开发技术(点击传送门)

    上一篇:无
    下一篇:《Qt开发技术:图形视图框架(二)场景QGraphicsScene、QGraphicsItem与QGraphicsView详解


    前话

      使用到Qt的视图框架。


    Qt视图框架介绍

    简介

      图形视图框架(The Graphic View Framework)用于管理和与大量定制的二维图形项目交互,以及用于可视化项目的视图小部件,支持缩放和旋转。
      在这里插入图片描述

      该框架包括一个事件传播体系结构,允许对场景中的项目进行精确的双精度交互。项目可以处理按键事件、鼠标按下、移动、释放和双击事件,还可以跟踪鼠标移动。
      图形视图使用BSP(Binary Space Partitioning,即二进制空间分区)树提供非常快读得项目发现,因此,它可以实时现实大型场景,即使有数百万个项目。
      图形视图提供了一种基于项目得模型视图变成方法,多个视图可以观察单个场景,并且场景包含不同几何图形的项目。

    场景(The Scene)

      QGraphicsScene提供了图形视图场景,场景有如下职责:

    • 为管理大量项目(图元项目)提供快速界面;(实测同一个区域不能重叠多了,绘制会卡顿)
    • 将事件传播到每个项;
    • 管理项目状态,如选择和焦点处理;
    • 提供未转换的渲染功能;主要用于打印;
        该场景用作QGraphicsItem对象的容器。通过调用QGraphicsItem::additem() 将项添加到场景中,然后通过调用多个项发现函数之一来检索项。QGraphicsItem::items()及其重载返回由点、矩形、多边形或常规矢量路径包含或与之相交的所有项。QGraphicsItem::itemAt()返回特定点的最上面的项。所有项目发现功能都按降序堆叠顺序返回项目(即第一个返回的项目是最上面的,最后一个项目是最下面的)。
    QGraphicsScene scene;
    QGraphicsRectItem *rect = scene.addRect(QRectF(0, 0, 100, 100))
    QTransform transform;;
    QGraphicsItem *item = scene.itemAt(50, 50, transform);
    // item == rect
    

      QGraphicsScene的事件传播体系结构安排将场景事件传递到项目,并管理项目之间的传播。如果场景在某个位置接收到鼠标按下事件,则场景将事件传递到该位置的任何项目。
      QGraphicsScene还管理某些项状态,例如项选择和焦点。可以通过调用QGraphicsScene::setSelectionArea(),传递任意形状来选择场景中的项目。该功函数还可用作QGraphicsView中橡皮擦的选择区域。要获取所有当前选定项的列表,请调用QGraphicscene::selecteditems()。QGraphicsScene处理的另一个状态是项是否具有键盘输入焦点。可以通过调用QGraphicScene::setFocusItem()或 QGraphicsItem::setFocus()对项设置焦点,也可以通过调用QGraphicscene::focusItem()获取当前焦点项。
      最后,QGraphicScene允许您通过QGraphicScene::render()函数将部分场景渲染到绘制设备中。可以“打印”部分了解更多有关此内容的信息。

    视图(The View)

      QGraphicsView提供了视图小部件,它可以可视化场景的内容。可以将多个视图附加到同一场景中,以便在同一数据集中提供多个视口。视图小部件是一个滚动区域,并提供滚动条用于在大型场景中导航。要启用OpenGL支持,可以通过调用QGraphicsView::setViewport()将QGLWidget设置为视区。

    QGraphicsScene scene;
    myPopulateScene(&scene);
    QGraphicsView view(&scene);
    view.show();
    

      在将事件发送到可视化场景之前,视图从键盘和鼠标接收输入事件,并将其转换为场景事件(在适当的情况下将使用的坐标转换为场景坐标)。
      用转换矩阵QGraphicsView::transform(),视图可以转换场景的坐标系。这允许高级导航功能,如缩放和旋转。为了方便起见,qgraphicsView还提供了在视图和场景坐标之间转换的函数:QGraphicsView::mapToScene()和 QGraphicsView::mapFromScene()。
      在这里插入图片描述

    项目(The Item):图形元素

    QGraphicsItem是场景中图形项的基类。图形视图为典型形状提供了几个标准项,例如矩形(QGraphicsRectItem)、椭圆(QGraphicsEllipsItem)和文本项(QGraphicsTextItem),但在编写自定义项时,最强大的QGraphicsItem功能可用。除此之外,QGraphicsItem还支持以下功能:

    • 鼠标按下、移动、释放和双击事件,以及鼠标悬停事件、滚轮事件和上下文菜单事件;
    • 键盘输入焦点和按键事件;
    • 拖放;
    • 分组,通过父子关系,通过QGraphicsItemGroup;
    • 碰撞检测;

      项目位于本地坐标系中,与QGraphicsView类似,它还提供许多功能,用于在项目和场景之间以及从项目到项目之间映射坐标。此外,与QGraphicsView一样,它可以使用矩阵:QGraphicsItem::Transform()转换其坐标系。这对于旋转和缩放单个项目很有用。
      项可以包含其他项(子项)。父项的转换由其所有子项继承。但是,不管一个项的累积转换如何,它的所有函数(例如,QGraphicsItem::contains()QGraphicsItem::boundingRect()QGraphicsItem::collectsWith() 仍在本地坐标中操作。
      QGraphicsItem支持通过QGraphicsItem::shape()函数和QGraphicsItem::collipswith() 进行冲突检测,这两个函数都是虚拟函数。通过从QGraphicsItem::shape() 中返回项目的形状作为本地坐标QPaineterPath,QGraphicsItem将为您处理所有冲突检测。但是,如果您希望提供自己的碰撞检测,则可以重新实现QGraphicsItem::CollipsWith()
      在这里插入图片描述

    Qt图形视图框架中的类

      这些类为创建交互式应用程序提供了一个框架。
      在这里插入图片描述


    图形视图坐标系

      图形视图基于笛卡尔坐标系;场景中项目的位置和几何图形由两组数字表示:X坐标和Y坐标。使用未转换视图观察场景时,场景中的一个单元由屏幕上的一个像素表示。
      注意:由于图形视图使用qt坐标系,因此不支持倒Y轴坐标系(Y向上增长)。
      图形视图中有三个有效的坐标系**:项目坐标、场景坐标和视图坐标**。为了简化实现,图形视图提供了方便的功能,允许您在三个坐标系之间进行映射。
      渲染时,图形视图的场景坐标对应于QPainer的逻辑坐标,视图坐标与设备坐标相同。后续会说明逻辑坐标和设备坐标之间的关系。
      在这里插入图片描述

    项目坐标

      项目在自己的本地坐标系中。它们的坐标通常以中心点(0,0)为中心,这也是所有变换的中心。项目坐标系中的几何基元通常称为项目点、项目线或项目矩形。
      在创建自定义项时,只需要担心项坐标;QGraphicsScene和QGraphicsView将为您执行所有转换。这使得实现自定义项非常容易。例如,如果收到一个鼠标按下或拖动输入事件,则事件位置在项目坐标中给出。QGraphicsItem::contains()虚函数,如果某个点在项中,则返回true,否则返回false,在项坐标中接受一个点参数。类似地,项的边界矩形和形状位于项坐标中。
      在项目的位置是项目中心点在其父坐标系中的坐标;有时称为父坐标。在这个意义上,场景被视为所有无父项的“父项”。顶层项目的位置在场景坐标中。
      子坐标是相对于父坐标的。如果子坐标未转换,则子坐标和父坐标之间的差异与父坐标中项目之间的距离相同。例如:如果未转换的子项精确定位在其父项的中心点,则两个项的坐标系将相同。但是,如果子对象的位置是(10,0),子对象的(0,10)点将对应于其父对象的(10,10)点。
      因为项的位置和转换是相对于父项的,所以子项的坐标不受父项的转换的影响,尽管父项的转换隐式转换子项。在上面的例子中,即使父对象被旋转和缩放,子对象的(0,10)点仍然对应于父对象的(10,10)点。但是,相对于场景,子对象将遵循父对象的变换和位置。如果缩放父对象(2x,2x),子对象的位置将位于场景坐标(20,0),其(10,0)点将对应于场景上的点(40,0)。
      由于QGraphicsItem::pos()是少数例外之一,因此QGraphicsItem的函数在项坐标中操作,而不考虑项或其任何父项的转换。例如,项目的边界矩形(即QGraphicsItem::boundingRect())总是在项目坐标中给出。

    场景坐标

      场景表示其所有项的基础坐标系。场景坐标系描述了每个顶层项目的位置,也构成了从视图传递到场景的所有场景事件的基础。场景中的每个项目都有一个场景位置和边界矩形(QGraphicsItem::scenePos()和  QGraphicsItem::sceneBoundingRect()),除了其本地项pos和边界矩形之外。场景位置描述了项目在场景坐标中的位置,其场景边界矩形构成了QGraphicsScene如何确定场景的哪些区域已更改的基础。场景中的更改通过QGraphicsScene::changed()信号进行通信,参数是场景矩形的列表。

    视图坐标

      视图坐标是小部件的坐标。视图坐标中的每个单元对应一个像素。这个坐标系的特殊之处在于它相对于小部件或视区,并且不受观察到的场景的影响。QGraphicsView的视区的左上角始终是(0,0),右下角始终是(视区宽度,视区高度)。所有鼠标事件和拖放事件最初都作为视图坐标接收,您需要将这些坐标映射到场景,以便与项目交互。

    坐标映射

      在处理场景中的项目时,通常可以将坐标和任意形状从场景映射到项目、从项目映射到项目或从视图映射到场景。例如,在QGraphicsView的视区中单击鼠标时,可以通过调用QGraphicsView::mapToScene(),然后调用QGraphicsScene::ItemAt()来询问场景光标下的项目。如果要知道某个项在视区中的位置,可以对该项调用QGraphicsItem::MapToScene(),然后在视图上调用QGraphicsView::MapFromSecene()。最后,如果要查找视图椭圆中的项目,可以将QPaineterPath传递给mapToScene(),然后将映射的路径传递给QGraphicScene::items()。
      通过调用QGraphicsItem::MapToScene()和QGraphicsItem::mapFromScene(),可以将坐标和形状映射到项的场景或从中映射。还可以通过调用QGraphicsItem::mapTopParent()和qgraphicsItem::mapFromParent()映射到项的父项,或者通过调用QGraphicsItem::MapToItem()和QGraphicsItem::mapFromItem()在项之间映射。所有映射函数都可以映射点、矩形、多边形和路径。
      视图中有相同的映射函数,可用于映射到场景或从场景映射到场景。QGraphicsView::mapFromSecene()和QGraphicsView::mapToScene()。要从视图映射到项目,首先映射到场景,然后从场景映射到项目。


    关键特征

    缩放和旋转

      QGraphicsView支持与QPainer通过QGraphicsView::setMatrix()进行的相同的仿射转换。通过对视图应用转换,您可以轻松地添加对常见导航功能(如缩放和旋转)的支持。
    以下是如何在QGraphicsView子类中实现缩放和旋转插槽的示例:

    class View : public QGraphicsView
    {
      Q_OBJECT
      ...
    public slots:
      void zoomIn() { scale(1.2, 1.2); }
      void zoomOut() { scale(1 / 1.2, 1 / 1.2); }
      void rotateLeft() { rotate(-10); }
      void rotateRight() { rotate(10); }
      ...
    };
    

      槽函数可以连接到启用自动重复的QToolButtons。
      转换视图时,QGraphicsView保持视图中心对齐。
      有关如何实现基本缩放功能的代码,后续会有示例描述。

    项目组

      通过使一个项目成为另一个项目的子项目,您可以实现项目分组最基本的特性:

    • 项目将一起移动
    • 所有转换都从父项目传播到子项目。

      此外,QGraphicsItemGroup是一个特殊的项,它将子事件处理与用于向组中添加和删除项的有用接口结合在一起。将项添加到QGraphicsItemGroup将保留该项的原始位置和转换,而通常重新设置项将导致子项相对于其新父项重新定位自身。为了方便起见,可以通过调用QGraphicScene::CreateItemGroup()通过场景创建QGraphicsItemGroups。

    小部件和布局

    Qt4.4通过QGraphicsWidget引入了对几何和布局感知项的支持。这个特殊的基项类似于QWidget,但与QWidget不同,它不是从QPaintDevice继承的,而是从QGraphicsItem继承的。这允许您编写带有事件、信号和槽、大小提示和策略的完整小部件,还可以通过QGraphicsLinearLayout和QGraphicsGridLayout在布局中管理小部件的几何图形。

    QGraphicsWidget

      基于QGraphicsItem的功能和精简的占地面积,QGraphicsWidget提供了两个方面的最佳功能:QWidget的额外功能,例如样式、字体、调色板、布局方向及其几何图形,以及QGraphicsItem的分辨率独立性和转换支持。因为图形视图使用实坐标而不是整数,所以QGraphicsWidget的几何函数也在QRectF和QPointF上运行。这也适用于框架矩形、边距和间距。例如,对于QGraphicsWidget,指定内容页边距(0.5、0.5、0.5、0.5)并不少见。您可以创建子窗口和“顶级”窗口;在某些情况下,您现在可以为高级MDI应用程序使用图形视图。
      一些QWidget的属性是受支持的,包括窗口标志和属性,但不是全部。参考QGraphicsWidget的类文档,以全面了解什么是受支持的,什么是不受支持的。例如,可以通过将Qt::window标志传递给QGraphicsWidget的构造函数来创建装饰窗口,但图形视图当前不支持MacOs上常见的Qt::Sheet和Qt:: Drawer标志。

    QGraphicsLayout

      QGraphicsLayout是专门为QGraphicsWidget设计的第二代布局框架的一部分。它的API与QLayout非常相似。您可以在QGraphicsLinearLayout和QGraphicsGridLayout中管理小部件和子布局。您还可以通过自己对QGraphicsLayout子类化来轻松地编写自己的布局,或者通过编写QGraphicsLayoutItem的适配器子类,将自己的QGraphicsItem项添加到布局中。

    嵌入式小部件支持

      图形视图为在场景中嵌入任何小部件提供无缝支持。您可以嵌入简单的小部件,如QLineEdit或QPushButton,复杂的小部件,如QTabWidget,甚至完整的主窗口。要将小部件嵌入到场景中,只需调用QGraphicScene::AddWidget(),或创建QGraphicsProxyWidget实例手动嵌入小部件。
      通过QGraphicsProxyWidget,图形视图能够深入集成客户端小部件的功能,包括其光标、工具提示、鼠标、平板电脑和键盘事件、子小部件、动画、弹出窗口(如QComboBox或QCompeter),以及小部件的输入焦点和激活。QGraphicsProxyWidget甚至集成了嵌入式小部件的选项卡顺序,这样您就可以在嵌入式小部件中插入和取出选项卡。甚至可以将新的QGraphicsView嵌入到场景中,以提供复杂的嵌套场景。
      当转换嵌入的小部件时,图形视图确保小部件独立地转换分辨率,允许字体和样式在放大时保持清晰。(请注意,分辨率独立性的效果取决于样式。)


    性能

    浮点指令

      为了准确、快速地对项目应用转换和效果,在假设用户的硬件能够为浮点指令提供合理性能的前提下,构建了图形视图。
      许多工作站和台式计算机都配备了适当的硬件来加速这种计算,但是一些嵌入式设备可能只提供库来处理数学运算或模拟软件中的浮点指令。
      因此,某些类型的影响在某些设备上可能比预期的慢。可以通过在其他区域进行优化来补偿这种性能损失;例如,使用OpenGL渲染场景。但是,如果这些优化还依赖于浮点硬件的存在,那么它们本身可能会导致性能降低。


    上一篇:无
    下一篇:《Qt开发技术:图形视图框架(二)场景QGraphicsScene、QGraphicsItem与QGraphicsView详解


    若该文为原创文章,转载请注明原文出处
    本文章博客地址:https://blog.csdn.net/qq21497936/article/details/115791408

    展开全文
  • 其中包括:定义 item 的几何形状、碰撞检测、绘制实现、以及通过其事件处理程序进行 item 的交互,QGraphicsItem 是Qt之图形视图框架的一部分。 常见图元 为方便起见,Qt 为最常见的形状提供了一组标准...

    简述

    QGraphicsItem 类是 QGraphicsScene 中所有 item(图元)的基类。

    它提供了一个轻量级的基础,用于编写自己的自定义 item。其中包括:定义 item 的几何形状、碰撞检测、绘制实现、以及通过其事件处理程序进行 item 的交互,QGraphicsItem 是 Qt之图形视图框架 的一部分。

     

    常见图元

    为方便起见,Qt 为最常见的形状提供了一组标准 item。它们是:

    QGraphicsSimpleTextItem:提供了一个简单的文本标签项 QGraphicsTextItem:提供了一个格式化的文本项 QGraphicsLineItem:提供了一个直线项 QGraphicsPixmapItem:提供了一个图像项 QGraphicsRectItem:提供了一个矩形项 QGraphicsEllipseItem:提供了一个椭圆项 QGraphicsPathItem:提供了一个路径项 QGraphicsPolygonItem:提供了一个多边形项

    QGraphicsSimpleTextItem

    详细描述

    QGraphicsSimpleTextItem 提供了一个简单的文本标签项,可以添加到 QGraphicsScene 中。

    要设置 item 的文本,可以传递 QString 到 QGraphicsSimpleTextItem 的构造函数,或在之后调用 setText() 来更改文本。要设置文本填充色,调用 setBrush()。

    QGraphicsSimpleTextItem 可以具有填充和轮廓,setBrush() 用于设置文本填充(即,文本色),setPen() 用于设置绘制文本轮廓的画笔,(后者可能很慢,特别是对于复杂的画笔,以及具有长文本内容的 item)。如果只想绘制一行简单的文本,只需要调用 setBrush(),不需要设置画笔。QGraphicsSimpleTextItem 的画笔默认是 Qt::NoPen。

    QGraphicsSimpleTextItem 使用文本的格式化大小和相关联的字体,为 boundingRect()、shape() 和 contains() 提供了一个合理的实现。可以通过调用 setFont() 设置字体。

    QGraphicsSimpleText 不显示富文本,相反,可以使用 QGraphicsTextItem,它提供全文控制功能。

    这里写图片描述

    示例

    这里写图片描述

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    // 定义一个 item

    QGraphicsSimpleTextItem *pItem = new QGraphicsSimpleTextItem();

    pItem->setText(QString::fromLocal8Bit("一去丶二三里"));

     

    // 字体

    QFont font = pItem->font();

    font.setPixelSize(20);  // 像素大小

    font.setItalic(true);  // 斜体

    font.setUnderline(true);  // 下划线

    pItem->setFont(font);

     

    pItem->setBrush(QBrush(QColor(0, 160, 230)));

     

    // 将 item 添加至场景中

    QGraphicsScene *pScene = new QGraphicsScene();

    pScene->addItem(pItem);

     

    // 为视图设置场景

    QGraphicsView *pView = new QGraphicsView();

    pView->setScene(pScene);

    pView->setStyleSheet("border:none; background:transparent;");

     

    pView->show();

    要将 QGraphicsSimpleTextItem 添加至场景中,有两种方式:

    构造 QGraphicsSimpleTextItem,然后通过 QGraphicsScene::addItem() 添加。使用 QGraphicsScene::addSimpleText() 创建并添加一个 QGraphicsSimpleTextItem,并返回 item 的指针。

    QGraphicsTextItem

    详细描述

    QGraphicsTextItem 类提供了一个格式化的文本项,可以添加到 QGraphicsScene 中。

    要设置 item 的文本,可以传递 QString 到 QGraphicsTextItem 的构造函数,或调用 setHtml()/setPlainText()。

    QGraphicsTextItem 使用文本的格式化大小和相关联的字体,为 boundingRect()、shape() 和 contains() 提供了一个合理的实现。可以通过调用 setFont() 设置字体。

    可以通过使用 setTextInteractionFlags() 设置 Qt::TextEditorInteraction 标志来使 item 可编辑。

    item 的首选文本宽度可以使用 setTextWidth() 设置,并使用 textWidth() 获取。

    注意:为了在中心对齐 HTML 文本,必须设置 item 的文本宽度。否则,可以在设置 item 的文本后调用 adjustSize()。

    这里写图片描述

    注意:<喎�"/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPiBRR3JhcGhpY3NUZXh0SXRlbSDErMjPvdPK3CBob3ZlciDKwrz+o6y/ydLUyrnTwyBzZXRBY2NlcHRIb3ZlckV2ZW50cygpILj8uMS0y9a1oaM8L3A+DQo8aDIgaWQ9"纯文本">纯文本

    这里写图片描述

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    // 定义一个 item

    QGraphicsTextItem *pItem = new QGraphicsTextItem();

    pItem->setPlainText(QString::fromLocal8Bit("一去丶二三里"));  // 纯文本

    pItem->setDefaultTextColor(QColor(0, 160, 230));  // 文本色

     

    // 字体

    QFont font = pItem->font();

    font.setPixelSize(20);  // 像素大小

    font.setItalic(true);  // 斜体

    font.setUnderline(true);  // 下划线

    pItem->setFont(font);

     

    // 将 item 添加至场景中

    QGraphicsScene *pScene = new QGraphicsScene();

    pScene->addItem(pItem);

     

    // 为视图设置场景

    QGraphicsView *pView = new QGraphicsView();

    pView->setScene(pScene);

    pView->setStyleSheet("border:none; background:transparent;");

     

    pView->show();

    要将 QGraphicsTextItem 添加至场景中,有两种方式:

    构造 QGraphicsTextItem,然后通过 QGraphicsScene::addItem() 添加。使用 QGraphicsScene::addText() 创建并添加一个 QGraphicsTextItem,并返回 item 的指针。

    富文本

    假设文本是 HTML 格式,显示不同颜色的文本以及图片。

    这里写图片描述

    ?

    1

    QString strHTML = QString("

    \\ \\\ %1%2 \

    \加载中...\\").arg("I am a ").arg("Qter"); pItem->setHtml(strHTML);

    超链接

    我们需要使用标签 写一段简单的 HTML 超链接代码

    方式一:

    比较简单,直接调用 setOpenExternalLinks(true) 即可。

    ?

    1

    2

    3

    <code>pItem->setHtml(QString("%2").arg("http://blog.csdn.net/liang19890820").arg(QStringLiteral("一去丶二三里")));

    pItem->setOpenExternalLinks(true);

    pItem->setTextInteractionFlags(Qt::TextBrowserInteraction);</code>

    方式二:

    连接 linkActivated() 信号,然后调用 QDesktopServices 的 openUrl() 打开链接:

    ?

    1

    2

    3

    4

    5

    <code>pItem->setHtml(QString("%2").arg("http://blog.csdn.net/liang19890820").arg(QStringLiteral("一去丶二三里")));

    pItem->setTextInteractionFlags(Qt::TextBrowserInteraction);

    connect(pItem, &QGraphicsTextItem::linkActivated, [=](QString link) {

                QDesktopServices::openUrl(QUrl(link));

    });</code>

    注意:这两种方式都需要调用 setTextInteractionFlags(Qt::TextBrowserInteraction),指定交互方式为文本浏览器交互。

    编辑

    通过使用 setTextInteractionFlags() 设置 Qt::TextEditorInteraction 标志来使项目可编辑。

    这里写图片描述

    ?

    1

    2

    3

    4

    <code>pItem->setTextInteractionFlags(Qt::TextEditorInteraction);  // 可编辑

    connect(pItem->document(), &QTextDocument::contentsChanged, [=]() {

        qDebug() << pItem->toPlainText();

    });</code>

    输出如下:

    “Q”
    “Qt”
    “Qte”
    “Qter”

    QGraphicsLineItem

    详细描述

    QGraphicsLineItem 类提供了一个直线项,可以添加到 QGraphicsScene 中。

    要设置 item 的直线,可以传递 QLineF 到 QGraphicsLineItem 的构造函数,或调用 setLine() 函数。line() 返回当前直线。默认情况下,该直线为黑色,宽度为 0,可以通过调用 setPen() 进行更改。
    ?
    这里写图片描述

    QGraphicsLineItem 使用直线和画笔的宽度,为 boundingRect()、shape() 和 contains() 提供了一个合理的实现。paint() 函数使用 item 关联的画笔绘制直线。

    示例

    这里写图片描述

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    <code>// 定义一个 item

    QGraphicsLineItem *pItem = new QGraphicsLineItem();

     

    // 设置画笔

    QPen pen = pItem->pen();

    pen.setColor(QColor(0, 160, 230));

    pen.setWidth(5);

    pItem->setPen(pen);

     

    // 设置直线位于 (x1, y1) 和 (x2, y2)之间

    pItem->setLine(QLineF(0, 0, 100, 100));

     

    // 将 item 添加至场景中

    QGraphicsScene *pScene = new QGraphicsScene();

    pScene->addItem(pItem);

     

    // 为视图设置场景

    QGraphicsView *pView = new QGraphicsView();

    pView->setScene(pScene);

    pView->setStyleSheet("border:none; background:transparent;");

     

    pView->show();</code>

    要将 QGraphicsLineItem 添加至场景中,有两种方式:

    构造 QGraphicsLineItem,然后通过 QGraphicsScene::addItem() 添加。使用 QGraphicsScene::addLine() 创建并添加一个 QGraphicsLineItem,并返回 item 的指针。

    QGraphicsPixmapItem

    详细描述

    QGraphicsPixmapItem 类提供了一个图像项,可以添加到 QGraphicsScene 中。

    要设置 item 的图像,可以传递 QPixmap 到 QGraphicsPixmapItem 的构造函数,或调用 setPixmap() 函数,pixmap() 返回当前的图像。

    QGraphicsPixmapItem 使用 pixmap 的可选 alpha 掩码,为 boundingRect()、shape() 和 contains() 提供了一个合理的实现。

    这里写图片描述
    ?
    图像在 item 的 (0, 0) 坐标处绘制,由 offset() 返回。可以通过调用 setOffset() 更改绘图偏移量。

    可以通过调用 setTransformationMode() 设置图像的变换模式,默认情况下,使用 Qt::FastTransformation,它提供了快速、不平滑的缩放。Qt::SmoothTransformation 在 painter 上启用 QPainter::SmoothPixmapTransform,质量取决于平台和视口。结果通常不如调用 QPixmap::scale() 直接,调用 transformMode() 获取项目的当前转换模式。

    示例

    这里写图片描述

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    <code>// 定义一个 item

    QGraphicsPixmapItem *pItem = new QGraphicsPixmapItem();

     

    QPixmap image(":/Images/logo");

    pItem->setPixmap(image.scaled(50, 50));

     

    // 将 item 添加至场景中

    QGraphicsScene *pScene = new QGraphicsScene();

    pScene->addItem(pItem);

     

    // 为视图设置场景

    QGraphicsView *pView = new QGraphicsView();

    pView->setScene(pScene);

    pView->setStyleSheet("border:none; background:transparent;");

     

    pView->show();</code>

    要将 QGraphicsPixmapItem 添加至场景中,有两种方式:

    构造 QGraphicsPixmapItem,然后通过 QGraphicsScene::addItem() 添加。使用 QGraphicsScene::addPixmap() 创建并添加一个 QGraphicsPixmapItem,并返回 item 的指针。

    QGraphicsRectItem

    详细说明

    QGraphicsRectItem 类提供了一个矩形项,可以添加到 QGraphicsScene 中。

    要设置 item 的矩形,可以传递一个 QRectF 到 QGraphicsRectItem 的构造函数,或调用 setRect() 函数。rect() 返回当前矩形。

    这里写图片描述
    ?
    QGraphicsRectItem 使用矩形和画笔宽度,为 boundingRect()、shape() 和 contains() 提供了一个合理的实现。paint() 函数使用 item 关联的画笔和画刷绘制矩形,可以通过调用 setPen() 和 setBrush() 函数来设置。

    注意:无效矩形(例如,宽度或高度为负)的呈现是未定义的。如果不能确定使用的是有效的矩形(例如,如果使用来自不可靠源的数据创建的矩形),那么应该使用 QRectF::normalized() 创建标准化的矩形,然后使用它们。

    示例

    这里写图片描述

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    <code>// 定义一个 item

    QGraphicsRectItem  *pItem = new QGraphicsRectItem();

     

    // 设置画笔、画刷

    QPen pen = pItem->pen();

    pen.setWidth(5);

    pen.setColor(Qt::white);

    pItem->setPen(pen);

    pItem->setBrush(QBrush(QColor(0, 160, 230)));

     

    // 矩形区域 起点:(50, 50) 宽:100 高:100

    pItem->setRect(QRectF(50, 50, 100, 100));

     

    // 将 item 添加至场景中

    QGraphicsScene *pScene = new QGraphicsScene();

    pScene->addItem(pItem);

     

    // 为视图设置场景

    QGraphicsView *pView = new QGraphicsView();

    pView->setScene(pScene);

    pView->setStyleSheet("border:none; background:transparent;");

     

    pView->show();</code>

    要将 QGraphicsRectItem 添加至场景中,有两种方式:

    构造 QGraphicsRectItem,然后通过 QGraphicsScene::addItem() 添加。使用 QGraphicsScene::addRect() 创建并添加一个 QGraphicsRectItem,并返回 item 的指针。

    QGraphicsEllipseItem

    详细说明

    QGraphicsEllipseItem 类提供了一个椭圆项,可以添加到 QGraphicsScene 中。

    QGraphicsEllipseItem 表示一个带有填充和轮廓的椭圆,也可以使用它的椭圆段(见 startAngle()、spanAngle())。

    ?这里写图片描述这里写图片描述

    要设置 item 的椭圆,可以传递一个 QRectF 到 QGraphicsEllipseItem 的构造函数,或调用 setRect()。rect() 返回当前椭圆的几何形状。

    QGraphicsEllipseItem 使用 rect 和画笔宽度,为 boundingRect()、shape() 和 contains() 提供了一个合理的实现。paint() 函数使用 item 关联的画笔和画刷来绘制椭圆,可以通过调用 setPen() 和 setBrush() 来设置。

    示例

    这里写图片描述

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    <code>// 定义一个 item

    QGraphicsEllipseItem *pItem = new QGraphicsEllipseItem ();

     

    // 设置画笔、画刷

    QPen pen = pItem->pen();

    pen.setWidth(5);

    pen.setColor(Qt::white);

    pItem->setPen(pen);

    pItem->setBrush(QBrush(QColor(0, 160, 230)));

     

    // 矩形区域 起点:(50, 50) 宽:200 高:100

    pItem->setRect(QRectF(50, 50, 200, 100));

    pItem->setStartAngle(16 * 90);  // 起始角度

    pItem->setSpanAngle(16 * 270);  // 跨角

    // 默认情况下,角度为 5760(360 * 16,一个完整的椭圆)。

     

    // 将 item 添加至场景中

    QGraphicsScene *pScene = new QGraphicsScene();

    pScene->addItem(pItem);

     

    // 为视图设置场景

    QGraphicsView *pView = new QGraphicsView();

    pView->setScene(pScene);

    pView->setStyleSheet("border:none; background:transparent;");

     

    pView->show();</code>

    要将 QGraphicsEllipseItem 添加至场景中,有两种方式:

    构造 QGraphicsEllipseItem,然后通过 QGraphicsScene::addItem() 添加。使用 QGraphicsScene::addEllipse() 创建并添加一个 QGraphicsEllipseItem,并返回 item 的指针。

    QGraphicsPathItem

    详细描述

    QGraphicsPathItem 类提供了一个路径项,可以添加到 QGraphicsScene 中。

    要设置 item 的路径,可以传递 QPainterPath 到 QGraphicsPathItem 的构造函数,或调用 setPath() 函数,path() 返回当前路径。

    这里写图片描述

    QGraphicsPathItem 使用路径,为 boundingRect()、shape() 和 contains() 提供了一个合理的实现。paint() 函数使用 item 关联的画笔和画刷来绘制路径,可以通过调用 setPen() 和 setBrush() 函数来设置。

    示例

    这里写图片描述

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    <code>const float Pi = 3.14159f;

     

    // 定义一个 item

    QGraphicsPathItem *pItem = new QGraphicsPathItem();

     

    // 绘制星星

    QPainterPath starPath;

    starPath.moveTo(90, 50);

    for (int i = 1; i < 5; ++i) {

        starPath.lineTo(50 + 40 * std::cos(0.8 * i * Pi), 50 + 40 * std::sin(0.8 * i * Pi));

    }

    starPath.closeSubpath();

    pItem->setPath(starPath);

     

    // 设置画笔、画刷

    QPen pen = pItem->pen();

    pen.setWidth(2);

    pen.setColor(Qt::white);

    pItem->setPen(pen);

    pItem->setBrush(QBrush(QColor(0, 160, 230)));

     

    // 将 item 添加至场景中

    QGraphicsScene *pScene = new QGraphicsScene();

    pScene->addItem(pItem);

     

    // 为视图设置场景

    QGraphicsView *pView = new QGraphicsView();

    pView->setScene(pScene);

    pView->setStyleSheet("border:none; background:transparent;");

     

    pView->show();</code>

    要将 QGraphicsPathItem 添加至场景中,有两种方式:

    构造 QGraphicsPathItem,然后通过 QGraphicsScene::addItem() 添加。使用 QGraphicsScene::addPath() 创建并添加一个 QGraphicsPathItem,并返回 item 的指针。

    QGraphicsPolygonItem

    详细描述

    QGraphicsPolygonItem 类提供了一个多边形项,可以添加到 QGraphicsScene 中。

    要设置 item 的多边形,传递 QPolygonF 到 QGraphicsPolygonItem 的构造函数,或调用 setPolygon() 函数。polygon() 返回当前的多边形。

    这里写图片描述

    QGraphicsPolygonItem 使用多边形和画笔宽度,为 boundingRect()、shape() 和 contains() 提供了一个合理的实现。paint() 函数使用 item 关联的画笔和画刷绘制多边形,可以通过调用 setPen() 和 setBrush() 函数进行设置。

    示例

    这里写图片描述

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    <code>// 定义一个 item

    QGraphicsPolygonItem *pItem = new QGraphicsPolygonItem();

     

    // 绘制多边形

    QPolygonF polygon;

    polygon << QPointF(200.0, 120.0) << QPointF(230.0, 130.0)

            << QPointF(260.0, 180.0) << QPointF(200.0, 200.0);

    pItem->setPolygon(polygon);

     

    // 设置画笔、画刷

    QPen pen = pItem->pen();

    pen.setWidth(2);

    pen.setColor(Qt::white);

    pItem->setPen(pen);

    pItem->setBrush(QBrush(QColor(0, 160, 230)));

     

    // 将 item 添加至场景中

    QGraphicsScene *pScene = new QGraphicsScene();

    pScene->addItem(pItem);

     

    // 为视图设置场景

    QGraphicsView *pView = new QGraphicsView();

    pView->setScene(pScene);

    pView->setStyleSheet("border:none; background:transparent;");

     

    pView->show();</code>

    要将 QGraphicsPolygonItem 添加至场景中,有两种方式:

    构造 QGraphicsPolygonItem,然后通过 QGraphicsScene::addItem() 添加。使用 QGraphicsScene::addPolygon() 创建并添加一个 QGraphicsPolygonItem,并返回 item 的指针。

    展开全文
  • 了解常见图形API

    千次阅读 2020-07-02 23:33:16
    常见图形API 目前比较常见图形API主要有以下几种 OpenGL OpenGL ES OPenCV DirectX Metal 下面来具体介绍下各种API的特点 OPenGL(Open Graphics Library) OpenGL是一个跨平台、跨语言的编程图形框架,主要...
  • 接上文 计算机图形学 学习笔记(七):二维图形变换:平移,比例,旋转,坐标变换等通过图形变换,可由简单图形得到复杂图形图形变化则分为维几何变换和投影变换。6.1 图形几何变换维物体的几何...
  • QT图形视图框架

    2015-08-08 15:13:47
    QT图形视图框架(The Graphics View Framework) 分类: Qt2010-03-24 21:11 14545人阅读 评论(9) 收藏 举报 图形框架qt嵌入式animation文档 目录(?)[+] 图形视图框架 The Graphics View Framework ...
  • Qt图形视图框架:QGraphicsScene详解

    千次阅读 2021-05-26 13:36:23
    它与视图一起用于可视化2D曲面上的图形图形项。 2、场景没有自己的视觉外观,只负责管理图形项。 3、场景的最大优势之一就是其快速有效地定位图形项的能力。即使场景中有数百万个图形项。 4、场景的另一个职责是...
  • 测试开发笔记

    万次阅读 多人点赞 2019-11-14 17:11:58
    40 视图/虚表 view 41 索引 42 存储过程 procedure 42 事务 transaction 43 触发器 trigger 46 练习 46 一、单表查询练习 46 二、聚合函数练习 47 、分组查询练习 47 四、嵌套查询练习 48 五、联接查询练习 48 六...
  • 初探AR技术

    千次阅读 多人点赞 2019-10-06 15:36:58
    ARCore 可以查找看起来位于常见水平或垂直表面(例如桌子或墙)上的成簇特征点,并让这些表面可以由您的应用用作平面。 ARCore 也可以确定每个平面的边界,并将该信息提供给您的应用。 您可以使用此信息将虚拟物体...
  • 用Python演绎5种常见可视化视图

    千次阅读 2020-06-14 10:00:00
    作者:妄心xyx来源:简书用Python演绎5种常见可视化视图通过本篇文章,你将学到:视图的分类,从哪些维度进行分类5种常见视图的概念,以及如何在Python中进行使用,都需要用到哪些函...
  • Qt的图形视图框架,最核心的个类为:QGraphicsScene、QGraphicsItem与QGraphicsView。
  • vue面试题总汇

    千次阅读 多人点赞 2019-02-22 15:26:53
    常见的判断方法:typeof 判断已知对象类型的方法: instanceof 根据对象的constructor判断: constructor 无敌万能的方法:jquery.type() vue与angular的区别? 1.vue仅仅是mvvm中的view层,只是一个如...
  • TensorFlow入门

    千次阅读 多人点赞 2019-04-23 10:09:29
    最后一个属性表示的是张量的类型,每个张量都会有唯一的类型,常见的张量类型如下图所示。 我们需要注意的是要保证参与运算的张量类型相一致,否则会出现类型不匹配的错误。如下面程序所示,当参与运算的张量...
  • ERP

    千次阅读 2018-11-14 22:16:03
    它将包含客户/服务架构,使用图形用户接口,应用开放系统制作。除了已有的标准功能,它还包括其它特性,如品质、过程运作管理、以及调整报告等。 1.2 软件项目常识 1.2.1 软件生存周期模型 软件生存周期模型是...
  • 缓存图形加快渲染速度,当需要重新绘制时图形项使用缓存的图形。 1、NoCache 默认值,所有图形项缓存均已禁用。每次需要重新绘制图形项时,都会调用QGraphicsItem::paint()。 2、ItemCoordinateCache 为图形...
  • 《数据库原理》— 数据库系统概论第五版习题解析

    万次阅读 多人点赞 2017-05-29 14:57:48
    数据的种类有数字、文字、图形、图像、声音、正文等。数据与其语义是不可分的。解析在现代计算机系统中数据的概念是广义的。早期的计算机系统主要用于科学计算,处理的数据是整数、实数、浮点数等传统数学中的数据。...
  • C#基础教程-c#实例教程,适合初学者

    万次阅读 多人点赞 2016-08-22 11:13:24
    Console.WriteLine("姓名:{0},年龄:{1}",name,age)的意义是将第二个参数变量name变为字符串填到{0}位置,将第个参数变量age变为字符串填到{1}位置,将第一个参数表示的字符串在显示器上输出。 大家注意,这里我们...
  • 资源下载 下面是《Android Studio开发实战 从零基础到App上线(第2版)》一书用到的工具和代码资源: 1、本书使用的Android Studio版本为3.2,... 12、第516页的“11.6.2 小知识:图形接口OpenGL” 该小节第段第四...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     QQ客户端登录界面,中部有个JPanel,有一个叫选项卡窗口管理。还可以更新好友列表,响应用户双击的事件,并得到好友的编号,把聊天界面加入到管理类,设置密码保护等。 Java编写的网页版魔方游戏 内容索引:JAVA...
  • 详细讲解了OpenGL\WebGL关于绘制场景的图形变换过程,并推导了其图形变换矩阵。主要包括模型变换、视图变换以及投影变换。
  • 下面介绍五种常见的第角画法视图的组合形式及投射方向。 如图13-7a所示,该视图是主视图、俯视图和右视图的组合。主、俯、右视图的投射方向如图中箭头所示。 如图13-7b所示,该视图是主视图、俯视图和左视图的...
  • iOS图形编程的种API

    千次阅读 2017-06-27 00:11:53
    一个图形环境包含绘制参数和所有的绘制需要的设备特定信息,包括屏幕图形环境、offscreen 位图环境和PDF图形环境,用来在屏幕表面、一个位图或一个pdf文件中进行图形和图像绘制。在屏幕图形环境中进行的绘制限定于在...
  • WPF开发教程

    万次阅读 多人点赞 2019-07-02 23:13:20
    4. WPF的图形应用... 219 5. WPF的维变换应用... 229 6. WPF的动画开发... 238 7. WPF的多媒体开发... 250                           ...
  • 图形视图框架 The Graphics View Framework 关键词翻译对照表: Graphics View:图形视图。 Scene:场景 /场景管理器( Scene同时担负着管理场景中的对象,建立索引等工作)。 Item:这里翻译为对象, ...
  • Qt图形视图框架:QGraphicsView详解

    千次阅读 2021-05-29 13:18:38
    一、描述 QGraphicsView在可滚动视口中可视化QGraphicsScene的内容。例: QGraphicsScene scene;...默认情况下,在第一次显示视图时会自动检测可视化区域(通过调用 QGraphicsScene::itemsBoundi
  • Qt之图形视图框架

    2017-08-10 16:58:38
    图形视图(Graphics View)提供了一个平台,用于大量自定义2D图元的管理与交互,并提供了一个视图部件(view widget)来显示可以缩放和旋转的图元。 框架包括一个事件传播架构,支持场景(Scene)中的图元(Item...
  • 图形视图框架 The Graphics View Framework 关键词翻译对照表: Graphics View:图形视图。 Scene:场景/场景管理器(Scene同时担负着管理场景中的对象,建立索引等工作)。 Item:这里翻译为对象,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,897
精华内容 11,958
关键字:

常见图形的三视图