0

私がやること:

新しい 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
4

1 に答える 1

0

シグナルQSvgRenderer::repaintNeeded()を MySVGItem プロキシ スロットに接続する必要があります (例: "repaint")。

プロキシスロットの実装

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

また

QGraphicsSvgItem::renderer()を使用して、デフォルトの「エンジン」を設定します。

于 2015-02-05T14:50:31.720 に答える