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

时间:2013-11-07 08:27:26

标签: c++ qt opengl svg

我的所作所为:

我正在创建一个新的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中的对象显示在应该显示的位置,但它们没有正确设置动画,就像你静止不动(直到我激活某些事件,如悬停或拖动它们 - 这些代码片段未在此处显示)。


实际问题:

如何正确渲染这些“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

1 个答案:

答案 0 :(得分:0)

你把信号 QSvgRenderer :: repaintNeeded()连接到MySVGItem代理插槽,例如“重绘”。

代理插槽的实现

void MySVGItem::repaint()
{
  update();
}

OR

使用 QGraphicsSvgItem :: renderer()来设置默认的“引擎”。