Marble/MarbleMarbleWidget: Difference between revisions

    From KDE TechBase
    No edit summary
    Line 12: Line 12:




    == Making changes to the map ==
    == Creating a weather map ==
    Now we want to modify the map:
    Now we want to modify the map:


    Line 18: Line 18:


    We'd like to display a small weather map. So we turn on the satellite view, enable the clouds and enable the country border lines.
    We'd like to display a small weather map. So we turn on the satellite view, enable the clouds and enable the country border lines.
    By default Marble shows a few info boxes: Overview Map, Compass and ScaleBar.
    Due to the limited size we want to shrink the compass. We turn the Overview Map and the ScaleBar off. In the source code the class [http://api.kde.org/4.x-api/kdeedu/marble/classMarble_1_1AbstractFloatItem.html AbstractFloatItem] is used to display Info Boxes:


    <code cppqt>
    <code cppqt>

    Revision as of 20:51, 5 July 2010


    Editing Projects/Marble/MarbleCPlusPlus

    MarbleWidget: Changing basic map properties
    Tutorial Series   Marble C++ Tutorial
    Previous   C++, Qt
    What's Next   Tutorial 3 - Marble's GeoPainter
    Further Reading   n/a


    Creating a weather map

    Now we want to modify the map:

    Again MarbleWidget provides a convenient way to make changes to the overall look and feel of the map:

    We'd like to display a small weather map. So we turn on the satellite view, enable the clouds and enable the country border lines.

    By default Marble shows a few info boxes: Overview Map, Compass and ScaleBar. Due to the limited size we want to shrink the compass. We turn the Overview Map and the ScaleBar off. In the source code the class AbstractFloatItem is used to display Info Boxes:

    1. include <QtGui/QApplication>
    1. include <marble/global.h>
    2. include <marble/MarbleWidget.h>
    3. include <marble/AbstractFloatItem.h>

    using namespace Marble;

    int main(int argc, char** argv) {

       QApplication app(argc,argv);
    
       // Create a Marble QWidget without a parent
       MarbleWidget *mapWidget = new MarbleWidget();
    
       // Load the OpenStreetMap map
       mapWidget->setMapThemeId("earth/bluemarble/bluemarble.dgml");
    
       mapWidget->setProjection( Mercator ); 
       
       // Enable the cloud cover and enable the country borders
       mapWidget->setShowClouds( true );
       mapWidget->setShowBorders( true );
       
       // Hide the FloatItems: Compass and StatusBar
       mapWidget->setShowOverviewMap(false);
       mapWidget->setShowScaleBar(false);
       
       foreach ( AbstractFloatItem * floatItem, mapWidget->floatItems() )
           if ( floatItem && floatItem->nameId() == "compass" ) {
               
               // Put the compass onto the left hand side
               floatItem->setPosition( QPoint( 10, 10 ) );
               // Make the content size of the compass smaller
               floatItem->setContentSize( QSize( 50, 50 ) );
           }
       
       mapWidget->resize( 400, 300 );
       mapWidget->show();
    
       return app.exec();
    

    }

    Save the code above as my_marble.cpp and compile it:

    g++ -I /usr/include/qt4/ -o my_marble my_marble.cpp -lmarblewidget -lQtGui
    

    If things go fine, execute ./my_marble and you end up with a fully usable OpenStreetMap application:

    Here's a little checklist to tackle some problems that might arise when compiling the code above:

    • You need Qt and Marble development packages (or comparable SVN installations)
    • If Qt headers are not installed in /usr/include/qt4 on your system, change the path in the g++ call above accordingly.
    • Likewise, add -I /path/to/marble/headers if they're not to be found in /usr/include