使用 QSvgRenderer 在 QGraphicsScene 上渲染动画 QGraphicsSvgItem(s)

Posted

技术标签:

【中文标题】使用 QSvgRenderer 在 QGraphicsScene 上渲染动画 QGraphicsSvgItem(s)【英文标题】:render animated QGraphicsSvgItem(s) on QGraphicsScene with QSvgRenderer 【发布时间】:2013-11-07 08:27:25 【问题描述】:

我做什么:

我正在创建一个新的 QGraphicsScene:

scene = new QGraphicsScene;

我有一个继承自 QGraphicsSvgItem 的类:

//hFile
class MySVGItem: public QGraphicsSvgItem

public:
    MySVGItem(QSvgRenderer *renderer, int x, int y);

    QRectF boundingRect() const;
    QPainterPath shape() const;

private:
    int x;
    int y;
;

//cpp File
Roboter::Roboter(QSvgRenderer *renderer, int x, int y)

    this->setSharedRenderer(renderer);
    this->x = x;
    this->y = y;
    setZValue((x + y) % 2);


我用其中一些项目填充我的场景,它们都共享相同的渲染器,因为它们应该显示相同的 svg。

QSvgRenderer *renderer = new QSvgRenderer(QLatin1String(":/res/file.svg"));

//some <for> loops
QGraphicsSvgItem *item = new MySVGItem(renderer , x, y);
scene->addItem(item);

然后我将场景设置为一些 QGraphicsView

view()->setScene(scene);

会发生什么:

MySVGItem 中的对象显示在它们应该显示的位置,但它们的动画效果不正确,就像你静止不动一样(直到我激活一些事件,比如悬停或拖动它们 - 这些代码 sn-ps 未在此处显示)。


实际问题:

如何正确渲染这些“MySVGItem”项目,显示它们的动画?

编辑

public
QRectF boundingRect() const;
QPainterPath shape() const;

QRectF MySVGItem::boundingRect() const

    return QRectF(0, 0, 200, 200);


QPainterPath MySVGItem::shape() const

    QPainterPath path;
    path.addRect(0, 0, 200, 200);
    return path;


//The svg File is 200x200

【问题讨论】:

不正确的boundingRect 实现可能会导致问题。请显示MySVGItem::boundingRectMySVGItem::shape 我在上一篇文章中添加了用作 EDIT 的 Shape 和 BoundingRect 代码。这有帮助吗? 不,似乎是正确的。 我是否需要一个计时器来更新()我的 svg,也许? 【参考方案1】:

您将信号 QSvgRenderer::repaintNeeded() 连接到 MySVGItem 代理槽,例如“repaint”。

代理槽的实现

void MySVGItem::repaint()

  update();

使用 QGraphicsSvgItem::renderer() 拥有默认的“引擎”。

【讨论】:

以上是关于使用 QSvgRenderer 在 QGraphicsScene 上渲染动画 QGraphicsSvgItem(s)的主要内容,如果未能解决你的问题,请参考以下文章

PyQt4 核心转储

QGraphicsView:如何高效获取QGraphicsItems的视口坐标?

未解决的到静态 Qwt 构建的外部链接

在 spark 上使用集群和在本地使用并行操作有啥区别?

在哪里使用 CORBA 以及在哪里使用 SNMP 进行监控?

为啥在使用 unicode 时我不能在 :before :after 内容之后使用空格