Qt Maps

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
js
Beiträge: 59
Registriert: 4. Juli 2011 21:29

Qt Maps

Beitrag 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....
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Qt Maps

Beitrag von franzf »

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

Re: Qt Maps

Beitrag von js »

ok, habs eingebaut...

danke franzf
js
Beiträge: 59
Registriert: 4. Juli 2011 21:29

Re: Qt Maps

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Qt Maps

Beitrag 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...
js
Beiträge: 59
Registriert: 4. Juli 2011 21:29

Re: Qt Maps

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Qt Maps

Beitrag 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.
js
Beiträge: 59
Registriert: 4. Juli 2011 21:29

Re: Qt Maps

Beitrag von js »

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

Re: Qt Maps

Beitrag 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.
Antworten