Marble/MarbleSignalsSlots: Difference between revisions

    From KDE TechBase
    Line 15: Line 15:
    We'd like to add other widgets to our Marble window: A '''zoom slider''' and a '''label''' that shows the current mouse position in '''geodetic''' coordinates: ''longitude'' and ''latitude''.
    We'd like to add other widgets to our Marble window: A '''zoom slider''' and a '''label''' that shows the current mouse position in '''geodetic''' coordinates: ''longitude'' and ''latitude''.


    In order to achieve this we need to create a vertical layout. Once done we add the slider and the label that we created to the layout. Also we zoom the globe to the slider's default value using the [http://api.kde.org/4.x-api/kdeedu/marble/classMarble_1_1MarbleWidget.html#d49d8ab0be0721c579bb511bdda45829 MarbleWidget::zoomView(int)] method.
    In order to achieve this we need to create a vertical layout. Once done we add the slider and the label that we created to the layout. Also we zoom the globe to the slider's default value using the [http://api.kde.org/4.x-api/kdeedu/marble/html/classMarble_1_1MarbleWidget.html#d49d8ab0be0721c579bb511bdda45829 MarbleWidget::zoomView(int)] method.


    We want to center our globe onto South America. So we create a new [http://api.kde.org/4.x-api/kdeedu/marble/classMarble_1_1GeoDataCoordinates.html GeoDataCoordinates] object that takes the longitude and the latitude as a parameter and we call [http://api.kde.org/4.x-api/kdeedu/marble/classMarble_1_1MarbleWidget.html#7cda9942ead26d60c89a7b54a073a2fd MarbleWidget::centerOn].
    We want to center our globe onto South America. So we create a new [http://api.kde.org/4.x-api/kdeedu-apidocs/marble/html/classMarble_1_1GeoDataCoordinates.html GeoDataCoordinates] object that takes the longitude and the latitude as a parameter and we call [http://api.kde.org/4.x-api/kdeedu/marblehtml/html/classMarble_1_1MarbleWidget.html#7cda9942ead26d60c89a7b54a073a2fd MarbleWidget::centerOn].


    Finally we connect the [http://doc.trolltech.com/signalsandslots.html signals and slots] that MarbleWidget offers to the signals and slots of the slider and the label:
    Finally we connect the [http://doc.trolltech.com/signalsandslots.html signals and slots] that MarbleWidget offers to the signals and slots of the slider and the label:

    Revision as of 08:37, 3 August 2010


    Editing Projects/Marble/MarbleCPlusPlus

    Basic interaction with MarbleWidget
    Tutorial Series   Marble C++ Tutorial
    Previous   Tutorial 2 - Changing basic map properties
    What's Next   Tutorial 4 - GeoPainter: Painting onto the map
    Further Reading   n/a


    Creating a window with controls

    We'd like to add other widgets to our Marble window: A zoom slider and a label that shows the current mouse position in geodetic coordinates: longitude and latitude.

    In order to achieve this we need to create a vertical layout. Once done we add the slider and the label that we created to the layout. Also we zoom the globe to the slider's default value using the MarbleWidget::zoomView(int) method.

    We want to center our globe onto South America. So we create a new GeoDataCoordinates object that takes the longitude and the latitude as a parameter and we call MarbleWidget::centerOn.

    Finally we connect the signals and slots that MarbleWidget offers to the signals and slots of the slider and the label:

    1. include <QtGui/QApplication>
    1. include <QtGui/QLayout>
    2. include <QtGui/QSlider>
    3. include <QtGui/QLabel>
    1. include <marble/MarbleWidget.h>

    using namespace Marble;

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

       QApplication app(argc,argv);
       QWidget *window = new QWidget;
    
       // Create a Marble QWidget without a parent
       MarbleWidget *mapWidget = new MarbleWidget();
    
       // Load the Plain map
       mapWidget->setMapThemeId("earth/plain/plain.dgml");
    
       // Hide the FloatItems: OverviewMap, ScaleBar and Compass
       mapWidget->setShowOverviewMap(false);
       mapWidget->setShowScaleBar(false);
       mapWidget->setShowCompass(false);
    
       // Set the map quality to gain speed
       mapWidget->setMapQuality( NormalQuality, Still );
       mapWidget->setMapQuality( LowQuality, Animation );
       
       // Create a horizontal zoom slider and set the default zoom
       QSlider * zoomSlider = new QSlider(Qt::Horizontal);
       zoomSlider->setMinimum( 1000 );
       zoomSlider->setMaximum( 2400 );
       
       mapWidget->zoomView( zoomSlider->value() );
    
       // Create a label to show the geodetic position
       QLabel * positionLabel = new QLabel();
       positionLabel->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed );
    
       // Add all widgets to the vertical layout.
       QVBoxLayout *layout = new QVBoxLayout;
       layout->addWidget(mapWidget);
       layout->addWidget(zoomSlider);
       layout->addWidget(positionLabel);
    
       // Center the map onto a given position
       GeoDataCoordinates home(-60.0, -10.0, 0.0, GeoDataCoordinates::Degree);
       mapWidget->centerOn(home);
       
       // Connect the map widget to the position label.
       QObject::connect( mapWidget, SIGNAL( mouseMoveGeoPosition( QString ) ),
                         positionLabel, SLOT( setText( QString ) ) );
    
       // Connect the zoom slider to the map widget and vice versa.
       QObject::connect( zoomSlider, SIGNAL( valueChanged(int) ),
                         mapWidget, SLOT( zoomView(int) ) );
       QObject::connect( mapWidget, SIGNAL( zoomChanged(int) ),
                         zoomSlider, SLOT( setValue(int) ) );
    
       window->setLayout(layout);
       window->resize( 400, 300 );
    
       window->show();
    
       return app.exec();
    

    }

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

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

    If things go fine, execute ./marble_control and you end up with a map application that displays our globe with a zoom slider below: