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.