Marble/MarbleSignalsSlots

From KDE TechBase
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.


Editing Projects/Marble/MarbleCPlusPlus

Basic interaction with MarbleWidget
Tutorial Series   Marble C++ Tutorial
Previous   C++, Qt
What's Next   Tutorial 4 - Marble's GeoPainter
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 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

  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 );
   // Center the map onto a given position
   GeoDataCoordinates home(-60.0, -10.0, 0.0, GeoDataCoordinates::Degree);
   mapWidget->centerOn(home);
   
   // Set default zoom and create horizontal zoom slider
   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);
   // 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: