einzelne Elemente einer SVG manipulieren
Verfasst: 17. November 2011 22:17
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:
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:
cpp
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
und dass ich mein Problem verständlich machen konnte...
Gruß,
Flutsch
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..
}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;
};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);
}
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
Gruß,
Flutsch