图形视图(15):【类】QGraphicsSvgItem [官翻]

QGraphicsSvgItem 类

QGraphicsSvgItem类是一个QGraphicsItem,可用于呈现SVG文件的内容。

Header:#include < QGraphicsSvgItem >
qmake:QT += widgets
Inherits:QGraphicsObject
Inherited By:
Since:Qt 4.2

详述

QGraphicsSvgItem提供了一种将SVG文件呈现到QGraphicsView上的方法。QGraphicsSvgItem可以通过将要呈现的SVG文件传递给其构造函数来创建,也可以通过在其上显式设置共享QSvgRenderer 来创建。

请注意,在QGraphicsSvgItem上设置QSvgRenderer不会使该项获得渲染器的所有权,因此,如果使用setSharedRenderer() 方法,则必须确保QSvgRenderer对象的生存期至少与QGraphicsSvgItem的生存期一样长。

QGraphicsSvgItem提供了一种通过setElementId仅呈现部分SVG文件的方法。如果调用setElementId()方法,则只有带有传递的id的SVG元素(及其子元素)是呈现器。这提供了一种方便的方法,可以选择性地呈现包含许多离散元素的大型SVG文件。例如,下面的代码只渲染一个包含整个纸牌组的SVG文件中的jokers:

 QSvgRenderer *renderer = new QSvgRenderer(QLatin1String("SvgCardDeck.svg"));
 QGraphicsSvgItem *black = new QGraphicsSvgItem();
 QGraphicsSvgItem *red   = new QGraphicsSvgItem();

 black->setSharedRenderer(renderer);
 black->setElementId(QLatin1String("black_joker"));

 red->setSharedRenderer(renderer);
 red->setElementId(QLatin1String("red_joker"));

可以通过直接操作项目转换矩阵来设置项目的大小。

默认情况下,使用QGraphicsItem::DeviceCoordinateCache模式缓存SVG渲染,以加快项目的显示速度。 可以通过将QGraphicsItem::NoCache传递给QGraphicsItem::setCacheMode() 方法来禁用缓存。

另请参见QSvgWidget,Qt SVG C ++类,QGraphicsItem 和 QGraphicsView。

属性

elementId : QString

此属性保存元素的XML ID。此属性在Qt 4.6中引入。只显示SVG文件具有同样ID的元素。

Access functions:

  • QString elementId() const
  • void setElementId(const QString &id)

maximumCacheSize : QSize

此属性保存该项目的设备坐标缓存的最大大小。此属性在Qt 4.6中引入。

Access functions:

  • QSize maximumCacheSize() const
  • void setMaximumCacheSize(const QSize &size)

公共函数

构造函数

  1. QGraphicsSvgItem(const QString &fileName, QGraphicsItem *parent = nullptr)
  2. QGraphicsSvgItem(QGraphicsItem *parent = nullptr)

属性相关

  1. QString elementId() const
    void setElementId(const QString &id)
  2. QSize maximumCacheSize() const
    void setMaximumCacheSize(const QSize &size)

QSvgRenderer

  1. QSvgRenderer * renderer() const
  2. void setSharedRenderer(QSvgRenderer *renderer)

重写的公共函数

  1. virtual QRectF boundingRect() const override
  2. virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override
  3. virtual int type() const override enum { Type = 13 };

演示代码

#include <QtWidgets>
#include <QtSvg>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setApplicationName ("图形框架");

    QGraphicsView view;

    int x = -200,y = -200;
    int w = 500,h=400;

    QGraphicsScene scene(x,y,w,h);
    scene.setBackgroundBrush (QBrush(qRgb (173,241,174)));

    // ..\Examples\Qt-5.15.0\quickcontrols2\imagine\musicplayer\icons\musicplayer\icons.svg
    QSvgRenderer *renderer = new QSvgRenderer(QString("icons.svg"),&scene);
    QGraphicsSvgItem *all = new QGraphicsSvgItem();
    QGraphicsSvgItem *part1 = new QGraphicsSvgItem();
    QGraphicsSvgItem *part2 = new QGraphicsSvgItem();
    QGraphicsSvgItem *part3 = new QGraphicsSvgItem();
    QGraphicsSvgItem *part4 = new QGraphicsSvgItem();

    all->setSharedRenderer(renderer);

    part1->setSharedRenderer(renderer);
    part2->setSharedRenderer(renderer);
    part3->setSharedRenderer(renderer);
    part4->setSharedRenderer(renderer);

    part1->setElementId ("g5472");
    part2->setElementId ("g5478");
    part3->setElementId ("g5484");
    part4->setElementId ("g5490");

    scene.addItem (all);
    scene.addItem (part1);
    scene.addItem (part2);
    scene.addItem (part3);
    scene.addItem (part4);

    all->setFlag (QGraphicsItem::ItemIsMovable,true);
    part1->setFlag (QGraphicsItem::ItemIsMovable,true);
    part2->setFlag (QGraphicsItem::ItemIsMovable,true);
    part3->setFlag (QGraphicsItem::ItemIsMovable,true);
    part4->setFlag (QGraphicsItem::ItemIsMovable,true);

    all->moveBy (x,y);
    part1->moveBy (x,y+80);
    part2->moveBy (x+40,y+80);
    part3->moveBy (x,y+120);
    part4->moveBy (x+40,y+120);

    view.setScene (&scene);
    view.setWindowFlag (Qt::WindowMinMaxButtonsHint,false);
    view.show ();
    return a.exec();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值