Du bist neu in der Welt von C++? Dann schau hier herein!
js
Beiträge: 59 Registriert: 4. Juli 2011 21:29
Beitrag
von js » 18. Juli 2012 07:39
Moin habe mich an Qt Mobile versucht um genau zu sein daran
http://doc.qt.nokia.com/qtmobility/tuto ... part1.html
leider bekomme ich die fehlermeldungen
Code: Alles auswählen
1>geomap.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: virtual __thiscall GeoMap::~GeoMap(void)" (??1GeoMap@@UAE@XZ)" in Funktion ""public: virtual void * __thiscall GeoMap::`scalar deleting destructor'(unsigned int)" (??_GGeoMap@@UAEPAXI@Z)".
1>mapswidget.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: virtual __thiscall MapsWidget::~MapsWidget(void)" (??1MapsWidget@@UAE@XZ)" in Funktion ""public: virtual void * __thiscall MapsWidget::`scalar deleting destructor'(unsigned int)" (??_GMapsWidget@@UAEPAXI@Z)".
1>C:\Gui\GUI\Win32\Release\\GUI.exe : fatal error LNK1120: 2 nicht aufgelöste externe Verweise.
habe es genau so gemacht wie im DOC und alles verlinkt was man verlinken konnte, sitze schon die ganze Nacht dran....
franzf
Beiträge: 3114 Registriert: 31. Mai 2006 11:15
Beitrag
von franzf » 18. Juli 2012 08:04
Aus dem Grund sollte man schauen, dass erst die C++-Grundlagen sitzen.
Dir fehlt die Implementierung der Destruktoren.
js
Beiträge: 59 Registriert: 4. Juli 2011 21:29
Beitrag
von js » 18. Juli 2012 08:22
ok, habs eingebaut...
danke franzf
js
Beiträge: 59 Registriert: 4. Juli 2011 21:29
Beitrag
von js » 18. Juli 2012 10:10
habe es jetzt in meien GUI eingebaut
Code: Alles auswählen
void GUI::testfunc() {
MapsWidget test;
QGeoServiceProvider *serviceProvider = new QGeoServiceProvider("nokia");
test.d->map = new GeoMap(serviceProvider->mappingManager());
QGraphicsScene *sc = new QGraphicsScene;
sc->addItem(test.d->map);
// test.d->map->resize(300, 480);
ui.graphicsView_2->setScene(sc);
test.d->map->setCenter(QGeoCoordinate(-27.5796, 153.1));
test.d->map->setZoomLevel(15);
}
wir alles angezeigt, wenn ich aber jedoch resize mache stürzt er ab mit der fehlermeldung
Zugriffsverletzung beim Schreiben an Position
und verweist auf die malloc.c
//allocate memory block
res = _heap_alloc(size)
ne idee woran das liegen könnte
franzf
Beiträge: 3114 Registriert: 31. Mai 2006 11:15
Beitrag
von franzf » 18. Juli 2012 12:08
Mit den Angaben leider nicht.
Ich seh nur, dass dein "MapsWidget test" die Funktion nicht überlebt. Und ein "test.d" von dem niemand ohne passenden Code (z.B. MapsWidget-Konstruktor) sagen kann, was das ist und ob es initialisiert wurde. Und natürlich, ob es vom MapsWidget-Destruktor wieder audgeräumt wird!
Insbesondere sollte es dann IMMER crashen, nie angezeigt werden und nicht nur beim resize Probleme bereiten...
js
Beiträge: 59 Registriert: 4. Juli 2011 21:29
Beitrag
von js » 18. Juli 2012 12:24
ne ne es wird schon angezeigt, nur halt nicht mit resize
mapswidget.cpp
Code: Alles auswählen
#include "mapswidget.h"
MapsWidget::MapsWidget(QWidget *parent) :
QWidget(parent)
{
}
MapsWidget::~MapsWidget()
{
}
mapswidget.h
Code: Alles auswählen
#ifndef MAPSWIDGET_H
#define MAPSWIDGET_H
#include "mapswidgetprivate.h"
#include <QWidget>
#include <QGeoMappingManager>
QTM_USE_NAMESPACE
class MapsWidget : public QWidget
{
Q_OBJECT
public:
MapsWidget(QWidget *parent = 0);
~MapsWidget();
public:
MapsWidgetPrivate *d;
};
#endif // MAPSWIDGET_H
mapswidgetprivate.h
Code: Alles auswählen
#ifndef MAPSWIDGETPRIVATE_H
#define MAPSWIDGETPRIVATE_H
#include "geomap.h"
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGeoCoordinate>
QTM_USE_NAMESPACE
class MapsWidgetPrivate
{
public: // nicht wundern ich habe es zum testen auf public geändert
GeoMap *map;
};
#endif // MAPSWIDGETPRIVATE_H
geomap.cpp
Code: Alles auswählen
#include "geomap.h"
GeoMap::GeoMap(QGeoMappingManager *manager) :
QGraphicsGeoMap(manager), mapsWidget(mapsWidget)
{
}
GeoMap::~GeoMap()
{
}
geomap.h
Code: Alles auswählen
#ifndef GEOMAP_H
#define GEOMAP_H
#include <QGraphicsGeoMap>
QTM_USE_NAMESPACE
class MapsWidget;
class GeoMap : public QGraphicsGeoMap
{
Q_OBJECT
public:
GeoMap(QGeoMappingManager *manager);
~GeoMap();
private:
MapsWidget *mapsWidget;
};
#endif // GEOMAP_H
ok habe die def. in die klasse eingebaut so das es jetzt so ausschaut
Code: Alles auswählen
serviceProvider = new QGeoServiceProvider("nokia");
test.d->map = new GeoMap(serviceProvider->mappingManager());
sc = new QGraphicsScene;
sc->addItem(test.d->map);
test.d->map->resize(300, 480);
ui.graphicsView_2->setScene(sc);
test.d->map->setCenter(QGeoCoordinate(-27.5796, 153.1));
test.d->map->setZoomLevel(15);
jetzt läuft es
franzf
Beiträge: 3114 Registriert: 31. Mai 2006 11:15
Beitrag
von franzf » 18. Juli 2012 12:43
Jut, da lag ich richtig:
MapsWidget::d wird nciht initialisiert, ist ein Zeiger ins Nirgendwo!
Das hier:
Code: Alles auswählen
GeoMap::GeoMap(QGeoMappingManager *manager) :
QGraphicsGeoMap(manager), >>> mapsWidget(mapsWidget) <<<
{
}
nochmal überdenken! Evtl. dein C++-Buch zu Initialisierungsliste/Elementinitialisierer befragen, wenn du nicht weißt was ich meine.
js
Beiträge: 59 Registriert: 4. Juli 2011 21:29
Beitrag
von js » 18. Juli 2012 14:24
Code: Alles auswählen
MapsWidget::MapsWidget(QWidget *parent) :
QWidget(parent)
{
d = new MapsWidgetPrivate;
}
MapsWidget::~MapsWidget()
{
d=NULL;
}
franzf
Beiträge: 3114 Registriert: 31. Mai 2006 11:15
Beitrag
von franzf » 18. Juli 2012 14:28
Und jetzt im Destruktor das "d" noch ordentlich zerstören, und alles sollte passen.
Natürlich unter der Voraussetzung, dass das temporäre "test" verschwindet und einem Objekt mit angemessener Lebensdauer weicht.