Seite 1 von 1

einzelne Elemente einer SVG manipulieren

Verfasst: 17. November 2011 22:17
von Flutsch
Moin,
ich bin ein ziemlicher Neuling in der GUI-Programmierung und möchte auf meinem GUI eine SVG darstellen, welche mittels eines entsprechenden Slots verändert werden kann, bzw. gezielt ein bestimmtes Element der SVG verändert. Diese Veränderung am sich ist nun nicht allzu aufwendig, d.h. ich möchte nur bei Bedarf einzelne Elemente vergrößern und evtl. deren Füllfarbe ändern. Nun habe ich mich in der Qt Doku ein bisschen umgesehen und rumprobiert, schaffe es allerdings nicht, ein Element zu verändern...
Da ich erstmal kleine Brötchen backen will, möchte ich zuerst ein Widget mit nem SVG und nem Pushbutton erstellen, wenn der Pushbutton gedrückt wird soll sich einfach nur die größe eines Elementes im SVG ändern... Allerdings klappt das Verändern gar nicht...Mein bisheriger Code hierzu sieht wie folgt aus:
MainWidget:

Code: Alles auswählen

test::test(QWidget *parent)
    : QWidget(parent)
{
	ui.setupUi(this);
	QVBoxLayout *layout = new QVBoxLayout();
	QPushButton *pb = new QPushButton("paint");  
	NQSvgWidget *pic = new NQSvgWidget("../Khepera - GUI/SVG/irsensor.svg", 0); //eigene Klasse mit PaintEvent zum verändern der SVG
	layout->addWidget(pic);
	layout->addWidget(pb);
	this->setLayout(layout);

	connect( pb, SIGNAL(clicked()), pic, SLOT(repaint()) ); //pushbutton soll repaint Event des QSvgWidgets auslösen..

}
schonmal die erste Frage, reicht für meine Zwecke ein NQSvgWidget, oder wäre ein QGraphicsScene besser/einfacher zu handhaben?

Widget zum darstellen/manipulieren der SVG:
header:

Code: Alles auswählen

class NQSvgWidget : public QSvgWidget
{
    Q_OBJECT

public:
    NQSvgWidget(QWidget *parent = 0);
    NQSvgWidget(const QString &file, QWidget *parent = 0);
    ~NQSvgWidget();

    virtual void PaintEvent(QPaintEvent*);

private:
    Ui::NQSvgWidgetClass ui;
};
cpp

Code: Alles auswählen

NQSvgWidget::NQSvgWidget(QWidget *parent)
    : QSvgWidget(parent)
{
	ui.setupUi(this);
}

NQSvgWidget::NQSvgWidget(const QString &file, QWidget *parent)
    : QSvgWidget( file, parent)
{
	ui.setupUi(this);
}

NQSvgWidget::~NQSvgWidget()
{

}

void NQSvgWidget::PaintEvent(QPaintEvent*)
{
	QSvgRenderer *rend = this->renderer();   //renderer für's SVGWidget holen
	QPainter painter(this);
	painter.setBrush(Qt::cyan);
	painter.drawEllipse(0,0, 50,50);
	rend->render(&painter, "s0");
	//QGraphicsSvgItem *ps0 = new QGraphicsSvgItem();
	//ps0->setSharedRenderer(rend);
	//ps0->setElementId("s0");
	//ps0->setScale(2);


}
das Auskommentierte unten war nur mal eine Idee ohne extra QPainter die Objekte zu verändern, aber um sie so zu verändern, müssten sie in einer QGraphicsScene sein oder hab ich da was falsch verstanden?
Was mich jetzt total irritiert bzw. es mir schwer macht meinen Denkfehler zu finden ist, dass so rein gar nichts passiert, wenn der Pushbutton ausgelöst wird, nichtmal ne Fehlermeldung...Was mir beim Versuch des Debuggens aufgefallen ist, dass wenn ich einen Breakpoint in der NQSvgWidget::PaintEvent Methode setze, dieser niemals "getroffen" wird, was mich zu dem Schluss führt, dass das PaintEvent gar nicht ausgeführt wird :?:
Der gedachte Ablauf bzw. so wie ich die Doku verstanden habe, is doch so, dass der repaint() SLOT des Widgets direkt das PaintEvent aufruft, welches ich ja mittels virtual void PaintEvent(QPaintEvent*); neu deklariert habe und im *.cpp auch entsprechend definiert...

Wie schon gesagt trete ich da Momentan irgendwie auf der Stelle und obwohl die Qt Doku von Nokia sehr ausführlich ist, komme ich nicht weiter, weil ich immer vom Hundertsten in's Tausendste komme und auch von den verschiedenen Möglichkeiten Grafiken einbinden/manipulieren zu können erschlagen bin. Letztendlich muss die Grafik die ich benutze auch keine SVG sein, ich dachte nur anfangs, dass diese für Veränderungen dieser Art ja eigentlich wie gemacht sind...z.B. nen einfacher gefüllter Kreis im SVG wird ja eigentlich nur durch Radius, Koordinaten, und Füllfarbe gespeicher/definiert und genau die wolllte einfach verändern...

Hoffe mein Code ist nicht allzu weit am Ziel vorbeigeschossen :angel: und dass ich mein Problem verständlich machen konnte...

Gruß,
Flutsch

Re: einzelne Elemente einer SVG manipulieren

Verfasst: 18. November 2011 09:16
von franzf
C++ ist Case-Sensitive (wie so ziemlich alle Programmiersprachen, die ich kenne).
-> paintEvent != PaintEvent...

Re: einzelne Elemente einer SVG manipulieren

Verfasst: 18. November 2011 10:56
von Flutsch
aaargh...das C++ Case sensitive ist weiß ich, hab mich nur verschrieben...danke jetzt passiert immerhin schon etwas =)
wenn ich die GUI jetzt ausführe, wird im NQSvgWidget jedoch nur der von mir neu gezeichnete Kreis und das Element welches ich mit der id "s0" angegeben habe angezeigt...was ich aber eigentlich machen wollte ist das Element "s0" verändern, in diesem fall durch einen Kreis ersetzen...Hast du da evtl. eine Idee zu? und wie sieht's mit meiner Frage bezüglich des QGraphicsSvgItem aus, stimmt da meine Annahme, dass die Benutzung dieser Klasse nur möglich/sinnvoll ist wenn sich die komplette SVG in einer QGraphicsScene befindet?

Gruß,
Flutsch

Re: einzelne Elemente einer SVG manipulieren

Verfasst: 18. November 2011 15:24
von franzf
Ein GraphicsItem - egal welcher Art - macht natürlich nur in einer QGraphicsScene einen Sinn (und auch da eigentlich nur, wenn die Scene in einer View angezeigt wird).
SVG speichert die Daten als reines XML an. Schau dir einfach in einem Editor an, wie das aufgebaut ist, dann kannst du das SVG per QDomDocument verändern (verlangt natürlich etwas Kenntnisse über den SVG-Standard, lässt sich aber sicher in der Spezifikation ermitteln).

Re: einzelne Elemente einer SVG manipulieren

Verfasst: 19. November 2011 14:21
von Flutsch
ok, dass hört sich ja schonmal gut an...ich werde mich morgen mal ransetzen und das mit dem QDocument ausprobieren...
Vielen dank für die Hilfe.

Gruß,
Flutsch