Seite 1 von 1

Problem mit QGraphicsSvgItem

Verfasst: 3. Dezember 2007 14:15
von SuperSonik
Hallo Leute,
ich habe ein Problem mit der QGraphicsSvgItem-Klasse unter QT 4.3.2 (Windows).

Ich habe eine eigene Klasse von QGraphicsScene abgeleitet in der ich gerne ein QGraphicsSvgItem anzeigen lassen möchte:

tga_draw_widget.h:

Code: Alles auswählen

#ifndef TGA_DRAW_WIDGET_H_
#define TGA_DRAW_WIDGET_H_


#include <QtSvg/QtSvg>
#include <QtGui/QGraphicsScene>
#include <QtGui/QGraphicsRectItem>
#include <QtSvg/QSvgRenderer>


class tga_draw_widget : public QGraphicsScene
{
	Q_OBJECT
public:
	tga_draw_widget(QGraphicsView* parent = 0, Qt::WFlags flags = 0);
	virtual ~tga_draw_widget();
private:
	QGraphicsSvgItem *test;
	QGraphicsRectItem *test2;
	QSvgRenderer *renderer;

};
#endif
tga_draw_widget.cpp:

Code: Alles auswählen

#include "tga_draw_widget.h"
#include <QtSvg/QtSvg>
#include <QtSvg/QSvgRenderer>
#include <QtCore/QString>
#include <QtGui/QGraphicsScene>
#include <QtGui/QGraphicsRectItem>

tga_draw_widget::tga_draw_widget(QGraphicsView* parent /*= 0*/, Qt::WFlags flags /*= 0*/) //: QWidget(parent, flags)
{
	renderer = new QSvgRenderer();
	renderer->load(QLatin1String("icons/tga/luftkuehler.svg"));
	

	test = new QGraphicsSvgItem();
	//test->show();
	test->setSharedRenderer(renderer);
	test->setElementId(QLatin1String("layer1"));

	test2 = new QGraphicsRectItem(0, 0, 20, 20);
	this->setSceneRect(QRectF(0,0,500,500));
	this->addItem(test2);
	this->addItem(test);
	parent->setScene(this);
	

}


tga_draw_widget::~tga_draw_widget()
{

}
In einer anderen Klasse wird diese Scene dann einem QGraphicsView zugewiesen. Diese Zuweisung findet in einem Slot statt und geschieht damit erst bei einem Klick auf den entsprechenden Button.

Code: Alles auswählen

void MOBILA::show_tga()
{
	
	tga_widget = new tga_draw_widget(ui.graphicsView_tga);
	ui.graphicsView_tga->show();


}
Wenn ich nun im Programm allerdings auf diesen Button klicke
stürzt das Programm ab und ich erhalte die Fehlermeldung:
QPixmap: Must construct a QApplication before a QPaintDevice

Was mache ich falsch? Die QApplication - Objekt müßte doch längst da sein da die Anwendung ja läuft bevor ich diesen Button klicke.
Es muss irgendwie an dem QGraphicsSvgItem Objekt liegen, denn wenn
ich in der Datei tga_draw_widget.cpp die Zeile

Code: Alles auswählen

this->addItem(test);
auskommentiere ,und das SvgItem damit nicht angezeigt wird, funktioniert alles bestens. - sprich das QGraphicsRectItem wird angezeigt

Kann mir jemand einen Hinweiß geben?
Gruß,
SuperSonik

Verfasst: 3. Dezember 2007 14:26
von Christian81
Ein Backtrace wäre nicht schlecht.
Ggf. liegt das Problem bei setSharedRenderer() - hat es so , wie du es benutzt, überhaupt einen Sinn - ich glaube nicht.

Verfasst: 3. Dezember 2007 14:31
von SuperSonik
Christian81 hat geschrieben:Ein Backtrace wäre nicht schlecht.
Ggf. liegt das Problem bei setSharedRenderer() - hat es so , wie du es benutzt, überhaupt einen Sinn - ich glaube nicht.
Nein der Renderer hat eigentlich keinen Sinn. Ich habe ihn nur mal eingebaut
um zu testen ob dies das Problem vielleicht löst, da in der Doku nur ein Beispiel mit Renderer ist.

Kannst Du mir sagen was ein Backtrace ist. - Habe ich noch nie gehört.
Gruß,
Sonik

Verfasst: 3. Dezember 2007 14:34
von Christian81
Aber einen Debugger haben wir schonmal benutzt??

http://www.google.de/search?hl=de&q=bac ... uche&meta=

Verfasst: 3. Dezember 2007 14:45
von SuperSonik
Christian81 hat geschrieben:Aber einen Debugger haben wir schonmal benutzt??

http://www.google.de/search?hl=de&q=bac ... uche&meta=
Ich habe früher bei C immer den ddd also die graphische Oberfläche zum gdb benutzt. Jetzt bei C++ und im Visual Studio 2005 habe ich den Debugger
noch nie benutzt. Ich habe mir bisher immer die Variablen ausgegeben, oder
bin aus den Fehlermeldungen auf der Kommandozeile schlau geworden. :oops:

Ich habe im Moment keine wirkliche Ahnung wie ich das jetzt debuggen soll. :(

Verfasst: 3. Dezember 2007 14:50
von Christian81
mit F9 einen Breakpoint setzen und starten - was ist so schwierig daran?

Verfasst: 3. Dezember 2007 14:59
von SuperSonik
Christian81 hat geschrieben:mit F9 einen Breakpoint setzen und starten - was ist so schwierig daran?
Eigentlich nichts -> Habe ich auch schon mal ausprobiert.
Ich habe mich mit den Breakpoints bis an die Zeile

Code: Alles auswählen

 tga_widget = new tga_draw_widget(ui.graphicsView_tga); 
vorgearbeitet. In der Zeile raucht das Programm dann ab.
Damit bin ich aber nicht schlauer wie vorher.
Vor dieser Zeile sehen sämtliche Variablen eigentlich gut aus.
Meine Variablen sind alle richtig belegt. Hinzu kommen noch eine Menge Variablen von denen ich keine Ahnung habe, teilweise vom moc, jede Menge Flags etc.

Verfasst: 3. Dezember 2007 15:02
von flare
Hi SuperSonik,

Na mit Visual Studio hast Du ja nen sehr guten Debugger. Und ohne kann man (zumindest ab einer berstimmten Projektgroeße) sowieso nicht richtig arbeiten.

Guck mal unter http://www.microsoft.com/germany/msdn/w ... =118769076 nach, da gibts nen ganz netten Webcast zu dem Thema, falls Du Dich noch nicht im VS-Debugger auskennst.

Verfasst: 3. Dezember 2007 15:08
von SuperSonik
Das hört sich gut an. Ich werde mich da mal durcharbeiten.
Vielen Dank.

Verfasst: 3. Dezember 2007 15:22
von flare
Bitte Bitte, gern geschehen.

Ich seh gerade bloß, dass der Webcast sich um Visual C# dreht, nicht um C++. Naja, man sollte sich halt selbst informieren, bevor man was postet... 8) Vielleicht kannst Du ja trotzdem ein bißchen was damit anfangen. Zumindest das "look-and-feel" kommt mit so einem webcast ja ganz gut rüber.

Ansonsten gibts auch ne Doku auf http://msdn2.microsoft.com/de-de/library/sc65sadd.aspx.

Verfasst: 3. Dezember 2007 16:20
von Christian81
Debug-Fenster -> Backtrace