Seite 1 von 1

[solved]QGraphicsSvg innerhalb eines QGraphicsItem

Verfasst: 6. August 2013 15:11
von Abayo
Hi!

Ich möchte in einer QGraphicsScene svg-Bilder verwenden.
Mit einem QSvgRenderer und scene.addItem() funktioniert das auch ganz gut.

Allerdings möchte ich nun folgendes:
Ich möchte ein QGraphicsObject erstellen und in diesem dann wiederum ein QGraphicsSvgItem. Das QGraphicsObject is dann praktisch die "Kontrolleinheit" in der ich alle veränderungen an dem Svg-Bild vornehme (möchte ich nicht in der Scene-Datei reinschreiben).
Nun haut das aber irgendwie nicht hin... das Bild sollte geladen werden (derselbe aufruf funktioniert auch in der main.cpp in der die Scene erstellt wird).

Code: Alles auswählen

    renderer = new QSvgRenderer(QString(QCoreApplication::applicationDirPath() + "/Bilder/zeigerV.svg"));
    picture = new QGraphicsSvgItem();
    picture->setSharedRenderer(renderer);
Was kann ich machen damit das geladene svg-Bild trotzdem angezeigt wird?

hier die Klasse in der ich das SvgItem erstelle:

die .h:

Code: Alles auswählen

#ifndef FRONT_H
#define FRONT_H

#include <QGraphicsSVGItem>
#include <QSvgRenderer>
#include <QGraphicsItem>
#include <QCoreApplication>

class Front : public QGraphicsObject
{
public:
    Front(QGraphicsItem *parent = 0);

    QRectF boundingRect() const;

    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);

private:
    QGraphicsSvgItem *picture;
    QSvgRenderer *renderer;
};

#endif // FRONT_H
die .cpp:

Code: Alles auswählen

#include "front.h"

Front::Front(QGraphicsItem *parent)
    : QGraphicsObject(parent)
{
    renderer = new QSvgRenderer(QString(QCoreApplication::applicationDirPath() + "/Bilder/zeigerV.svg"));
    picture = new QGraphicsSvgItem();

    picture->setSharedRenderer(renderer);
    picture->setPos(0,0);
    picture->show();
}

QRectF Front::boundingRect() const
{
    return QRect(0,0,30,125);
}

void Front::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QRectF rec = boundingRect();
    //painter->drawImage(0,0,*backPic);

    Q_UNUSED(option);
    Q_UNUSED(widget);
}
Vor dem benutzen des SvgItem hatte ich ein QImage das ich anstelle des SvgItem in dem Konstruktor erstellt und ein Bild geladen habe. Das hat auchgut funktioniert, ich musste nur zusätzlich in der paint() funktion das QImage zeichnen.
Muss ich das hier auch machen?

Ich hoffe hier kann mir jemand weiterhelfen. Die ganzen bisherigen Dokus die ich gefunden habe haben das QGraphicsSvgItem immer als Objekt erstellt und mit addItem() an die Scene übergeben. Aber das will ich ja nicht machen..

Re: QGraphicsSvg innerhalb eines QGraphicsItem

Verfasst: 6. August 2013 15:53
von Abayo
Kennt Ihr das wenn man einem kleinem "Popelfehler" stundenlang nicht bemerkt und sich fragt warum das ganze nicht geht?
Mir passiert das gerade ein wenig oft...

Der obige Code funktioniert so, ich hatte nur vergessen dem neuem QGraphicsSvgItem-Objekt das parent mitzugeben... Also einfach ien popliges "this" dazu...
.. Ich merke gerade, dass das Forum Smiles braucht die sich Ihren kopf auf den Tisch hauen oder gegen ne Wand ;)

Was anderes noch:

Der Ansatz wie ich ihn oben vorgestellt habe (SvgItem in einem QGraphicsItem und praktisch wie ein QImage verwenden), ist das annehmbar oder eher schlechter Stil?
Was hätte ich für andere Optionen? (Zur Erinnerung: Das Svg-Bild möchte ich nicht in der Scene laden und anzeigen)