Seite 1 von 1
Qt Maps
Verfasst: 18. Juli 2012 07:39
von js
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....
Re: Qt Maps
Verfasst: 18. Juli 2012 08:04
von franzf
Aus dem Grund sollte man schauen, dass erst die C++-Grundlagen sitzen.
Dir fehlt die Implementierung der Destruktoren.
Re: Qt Maps
Verfasst: 18. Juli 2012 08:22
von js
ok, habs eingebaut...
danke franzf
Re: Qt Maps
Verfasst: 18. Juli 2012 10:10
von js
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
Re: Qt Maps
Verfasst: 18. Juli 2012 12:08
von franzf
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...
Re: Qt Maps
Verfasst: 18. Juli 2012 12:24
von js
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
Re: Qt Maps
Verfasst: 18. Juli 2012 12:43
von franzf
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.
Re: Qt Maps
Verfasst: 18. Juli 2012 14:24
von js
Code: Alles auswählen
MapsWidget::MapsWidget(QWidget *parent) :
QWidget(parent)
{
d = new MapsWidgetPrivate;
}
MapsWidget::~MapsWidget()
{
d=NULL;
}
Re: Qt Maps
Verfasst: 18. Juli 2012 14:28
von franzf
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.