Marble/MarbleSignalsSlots: Difference between revisions
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. | 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 | 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. | ||
We want to center our globe onto a place that is different from the default. So we create a new GeoDataCoordinates object that takes the longitude and the latitude as a parameter. In the next step MarbleWidget::centerOn is called. | |||
<code cppqt> | <code cppqt> | ||
Line 47: | Line 50: | ||
mapWidget->setMapQuality( NormalQuality, Still ); | mapWidget->setMapQuality( NormalQuality, Still ); | ||
mapWidget->setMapQuality( LowQuality, Animation ); | mapWidget->setMapQuality( LowQuality, Animation ); | ||
// Set default zoom and create horizontal zoom slider | // Set default zoom and create horizontal zoom slider | ||
Line 69: | Line 68: | ||
layout->addWidget(positionLabel); | 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. | // Connect the map widget to the position label. | ||
QObject::connect( mapWidget, SIGNAL( mouseMoveGeoPosition( QString ) ), | QObject::connect( mapWidget, SIGNAL( mouseMoveGeoPosition( QString ) ), |
Revision as of 10:09, 6 July 2010
Editing Projects/Marble/MarbleCPlusPlus
Languages: عربي | Asturianu | Català | Česky | Kaszëbsczi | Dansk | Deutsch | English | Esperanto | Español | Eesti | فارسی | Suomi | Français | Galego | Italiano | 日本語 | 한국어 | Norwegian | Polski | Português Brasileiro | Română | Русский | Svenska | Slovenčina | Slovenščina | српски | Türkçe | Tiếng Việt | Українська | 简体中文 | 繁體中文
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 value using the MarbleWidget::zoomView(int) method.
We want to center our globe onto a place that is different from the default. So we create a new GeoDataCoordinates object that takes the longitude and the latitude as a parameter. In the next step MarbleWidget::centerOn is called.
- include <QtGui/QApplication>
- include <QtGui/QLayout>
- include <QtGui/QSlider>
- include <QtGui/QLabel>
- 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 );
// 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);
// 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: