Serial-Studio/libs/QMapControl/html/multidemo_8cpp-example.html
2021-12-06 10:56:03 -06:00

306 lines
18 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>QMapControl: multidemo.cpp</title>
<link href="tabs.css" rel="stylesheet" type="text/css">
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.5.9 -->
<div class="navigation" id="top">
<div class="tabs">
<ul>
<li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
<li><a href="annotated.html"><span>Classes</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
<li><a href="examples.html"><span>Examples</span></a></li>
</ul>
</div>
</div>
<div class="contents">
<h1>multidemo.cpp</h1>This is a bit complexer application, which lets you play around. There are the following buttons configured:<ul>
<li>Add Point: adds a Point to the coordinate you click (this point will be clickable)</li><li>Drag Rect: lets to drag a rectangular into which will be zoomed in</li><li>Move To Click: moves the view middle to the clicked coordinate</li><li>GPS: starts a "pseudo" GPS receiver which emits new positions, these are connected to the ImagePoint</li><li>Follow Geom: Follows the ImagePoint, when it moves because of new GPS positions</li></ul>
<p>
A overview map lefts you see where you are. You can even click on it to change your position.<p>
You can find this example here: MapAPI/Samples/Multimap <div align="center">
<img src="sample_multidemo.png" alt="sample_multidemo.png">
<p><strong>screenshot</strong></p></div>
<div class="fragment"><pre class="fragment"><span class="preprocessor">#include "multidemo.h"</span>
Multidemo::Multidemo(QWidget *parent)
: QWidget(parent)
{
setupMaps();
createLayout();
gm = <span class="keyword">new</span> GPS_Modul();
connect(gm, SIGNAL(new_position(QPointF)),
ip, SLOT(setCoordinate(QPointF)));
}
<span class="keywordtype">void</span> Multidemo::setupMaps()
{
QSize size = QSize(480,640);
<span class="comment">// main map control</span>
mc = <span class="keyword">new</span> MapControl(size);
MapAdapter* mapadapter = <span class="keyword">new</span> WMSMapAdapter(<span class="stringliteral">"www2.demis.nl"</span>, <span class="stringliteral">"/wms/wms.asp?wms=WorldMap&amp;LAYERS=Countries,Borders,Cities,Rivers,Settlements,Hillshading,Waterbodies,Railroads,Highways,Roads&amp;FORMAT=image/png&amp;VERSION=1.1.1&amp;SERVICE=WMS&amp;REQUEST=GetMap&amp;STYLES=&amp;EXCEPTIONS=application/vnd.ogc.se_inimage&amp;SRS=EPSG:4326&amp;TRANSPARENT=FALSE"</span>, 256);
<span class="comment">// maplayer</span>
Layer* l = <span class="keyword">new</span> MapLayer(<span class="stringliteral">"Custom Layer"</span>, mapadapter);
mc-&gt;addLayer(l);
<span class="comment">// Geometry layer</span>
Layer* l2 = <span class="keyword">new</span> GeometryLayer(<span class="stringliteral">"Geom Layer"</span>, mapadapter);
mc-&gt;addLayer(l2);
<span class="comment">// "minimap" control</span>
mc2 = <span class="keyword">new</span> MapControl(QSize(150,150), MapControl::None);
MapAdapter* mapadapter_mini = <span class="keyword">new</span> OSMMapAdapter();
Layer* layer_mini = <span class="keyword">new</span> MapLayer(<span class="stringliteral">"Custom Layer"</span>, mapadapter_mini);
mc2-&gt;addLayer(layer_mini);
<span class="comment">// create points</span>
QPen* pen = <span class="keyword">new</span> QPen(QColor(255, 0, 0, 100));
pen-&gt;setWidth(5);
QList&lt;Point*&gt; points;
points.append(<span class="keyword">new</span> CirclePoint(8.259959, 50.001781, <span class="stringliteral">"Mainz, Hauptbahnhof"</span>, Point::Middle, pen));
points.append(<span class="keyword">new</span> CirclePoint(8.263758, 49.998917, <span class="stringliteral">"Mainz, Münsterplatz"</span>, Point::Middle, pen));
points.append(<span class="keyword">new</span> CirclePoint(8.265812, 50.001952, <span class="stringliteral">"Mainz, Neubrunnenplatz"</span>, Point::Middle, pen));
points.append(<span class="keyword">new</span> CirclePoint(8.2688, 50.004015, <span class="stringliteral">"Mainz, Bauhofstraße LRP"</span>, Point::Middle, pen));
points.append(<span class="keyword">new</span> CirclePoint(8.272845, 50.00495, <span class="stringliteral">"Mainz, Landtag"</span>, Point::Middle, pen));
points.append(<span class="keyword">new</span> CirclePoint(8.272845, 50.00495, <span class="stringliteral">"Mainz, Brückenplatz"</span>, Point::Middle, pen));
points.append(<span class="keyword">new</span> CirclePoint(8.280349, 50.008173, <span class="stringliteral">"Mainz, Brückenkopf"</span>, Point::Middle, pen));
points.append(<span class="keyword">new</span> CirclePoint(8.273573, 50.016315, <span class="stringliteral">"Wiesbaden-Mainz-Kastel, Eleonorenstraße"</span>, Point::Middle, pen));
points.append(<span class="keyword">new</span> CirclePoint(8.275145, 50.016992, <span class="stringliteral">"Wiesbaden-Mainz-Kastel, Johannes-Goßner-Straße"</span>, Point::Middle, pen));
points.append(<span class="keyword">new</span> CirclePoint(8.270476, 50.021426, <span class="stringliteral">"Wiesbaden-Mainz-Kastel, Ruthof"</span>, Point::Middle, pen));
points.append(<span class="keyword">new</span> CirclePoint(8.266445, 50.025913, <span class="stringliteral">"Wiesbaden-Mainz-Kastel, Mudra Kaserne"</span>, Point::Middle, pen));
points.append(<span class="keyword">new</span> CirclePoint(8.260378, 50.030345, <span class="stringliteral">"Wiesbaden-Mainz-Amoneburg, Dyckerhoffstraße"</span>, Point::Middle, pen));
<span class="comment">// add points to linestring</span>
pen = <span class="keyword">new</span> QPen(QColor(0, 0, 255, 100));
pen-&gt;setWidth(5);
LineString* ls = <span class="keyword">new</span> LineString(points, <span class="stringliteral">"Busline 54"</span>, pen);
<span class="comment">// the linestring is added to the MapLayer l, since it doenst change its points</span>
l-&gt;addGeometry(ls);
<span class="comment">// this point receives position changes from the "gps modul"</span>
ip = <span class="keyword">new</span> ImagePoint(0,0, QCoreApplication::applicationDirPath() + <span class="stringliteral">"/images/marker1.png"</span>, <span class="stringliteral">"image point"</span>, Point::TopRight);
<span class="comment">// so if have to be added to the GeometryLayer l2</span>
l2-&gt;addGeometry(ip);
QPushButton* pb = <span class="keyword">new</span> QPushButton(<span class="stringliteral">"test button"</span>, mc);
<span class="comment">// widget example</span>
Point* wpoint = <span class="keyword">new</span> Point(-20,-20, pb, <span class="stringliteral">"."</span>, Point::TopLeft);
wpoint-&gt;setBaselevel(3);
l-&gt;addGeometry(wpoint);
pb-&gt;setGeometry(0,0,100,50);
connect(l, SIGNAL(geometryClicked(Geometry*, QPoint)),
<span class="keyword">this</span>, SLOT(geometryClickEvent(Geometry*, QPoint)));
connect(l2, SIGNAL(geometryClicked(Geometry*, QPoint)),
<span class="keyword">this</span>, SLOT(geometryClickEvent(Geometry*, QPoint)));
connect(mc, SIGNAL(boxDragged(<span class="keyword">const</span> QRectF)),
<span class="keyword">this</span>, SLOT(draggedRect(QRectF)));
connect(mc, SIGNAL(mouseEventCoordinate(<span class="keyword">const</span> QMouseEvent*, <span class="keyword">const</span> QPointF)),
<span class="keyword">this</span>, SLOT(mouseEventCoordinate(<span class="keyword">const</span> QMouseEvent*, <span class="keyword">const</span> QPointF)));
connect(mc, SIGNAL(mouseEventCoordinate(<span class="keyword">const</span> QMouseEvent*, <span class="keyword">const</span> QPointF)),
<span class="keyword">this</span>, SLOT(coordinateClicked(<span class="keyword">const</span> QMouseEvent*, <span class="keyword">const</span> QPointF)));
connect(mc2, SIGNAL(mouseEventCoordinate(<span class="keyword">const</span> QMouseEvent*, <span class="keyword">const</span> QPointF)),
<span class="keyword">this</span>, SLOT(coordinateClicked_mc2(<span class="keyword">const</span> QMouseEvent*, <span class="keyword">const</span> QPointF)));
}
<span class="keywordtype">void</span> Multidemo::createLayout()
{
btn1 = <span class="keyword">new</span> QPushButton(<span class="stringliteral">"Add Point"</span>);
btn1-&gt;setCheckable(<span class="keyword">true</span>);
btn1-&gt;setMaximumWidth(80);
btn1-&gt;setMaximumHeight(20);
btn1-&gt;setFont(QFont(<span class="stringliteral">"Verdana"</span>, 5));
btn2 = <span class="keyword">new</span> QPushButton(<span class="stringliteral">"Drag Rect"</span>);
btn2-&gt;setCheckable(<span class="keyword">true</span>);
btn2-&gt;setMaximumHeight(20);
btn2-&gt;setFont(QFont(<span class="stringliteral">"Verdana"</span>, 5));
btn2-&gt;setMaximumWidth(80);
btn3 = <span class="keyword">new</span> QPushButton(<span class="stringliteral">"Move to Click"</span>);
btn3-&gt;setCheckable(<span class="keyword">true</span>);
btn3-&gt;setMaximumHeight(20);
btn3-&gt;setFont(QFont(<span class="stringliteral">"Verdana"</span>, 5));
btn3-&gt;setMaximumWidth(80);
btn4 = <span class="keyword">new</span> QPushButton(<span class="stringliteral">"Follow Geom"</span>);
btn4-&gt;setCheckable(<span class="keyword">true</span>);
btn4-&gt;setMaximumHeight(20);
btn4-&gt;setFont(QFont(<span class="stringliteral">"Verdana"</span>, 5));
btn4-&gt;setMaximumWidth(80);
btn5 = <span class="keyword">new</span> QPushButton(<span class="stringliteral">"GPS"</span>);
btn5-&gt;setCheckable(<span class="keyword">true</span>);
btn5-&gt;setMaximumHeight(20);
btn5-&gt;setFont(QFont(<span class="stringliteral">"Verdana"</span>, 5));
btn5-&gt;setMaximumWidth(80);
btn1-&gt;setFocusPolicy(Qt::NoFocus);
btn2-&gt;setFocusPolicy(Qt::NoFocus);
btn3-&gt;setFocusPolicy(Qt::NoFocus);
btn4-&gt;setFocusPolicy(Qt::NoFocus);
btn5-&gt;setFocusPolicy(Qt::NoFocus);
QHBoxLayout* layout = <span class="keyword">new</span> QHBoxLayout;
QVBoxLayout* layoutinner = <span class="keyword">new</span> QVBoxLayout;
layoutinner-&gt;addWidget(mc2);
layoutinner-&gt;addWidget(btn1);
layoutinner-&gt;addWidget(btn2);
layoutinner-&gt;addWidget(btn3);
layoutinner-&gt;addWidget(btn4);
layoutinner-&gt;addWidget(btn5);
layoutinner-&gt;addSpacing(70);
layout-&gt;addLayout(layoutinner);
QHBoxLayout* mclayout = <span class="keyword">new</span> QHBoxLayout;
mclayout-&gt;addWidget(mc);
mclayout-&gt;setMargin(0);
setLayout(mclayout);
mc-&gt;setLayout(layoutinner);
connect(btn2, SIGNAL(toggled( <span class="keywordtype">bool</span> )),
<span class="keyword">this</span>, SLOT(buttonToggled(<span class="keywordtype">bool</span>)));
connect(btn4, SIGNAL(toggled( <span class="keywordtype">bool</span> )),
<span class="keyword">this</span>, SLOT(toggleFollow(<span class="keywordtype">bool</span>)));
connect(btn5, SIGNAL(toggled( <span class="keywordtype">bool</span> )),
<span class="keyword">this</span>, SLOT(toggleGPS(<span class="keywordtype">bool</span>)));
}
<span class="keywordtype">void</span> Multidemo::coordinateClicked(<span class="keyword">const</span> QMouseEvent* evnt, <span class="keyword">const</span> QPointF coord)
{
<span class="keywordflow">if</span> (btn1-&gt;isChecked() &amp;&amp; evnt-&gt;type()==QEvent::MouseButtonPress)
{
mc-&gt;layer(<span class="stringliteral">"Geom Layer"</span>)-&gt;addGeometry(<span class="keyword">new</span> CirclePoint(coord.x(), coord.y(), 10, <span class="stringliteral">"added point"</span>));
mc-&gt;updateRequestNew();
}
}
<span class="keywordtype">void</span> Multidemo::geometryClickEvent(Geometry* geom, QPoint)
{
<span class="keywordflow">if</span> (geom-&gt;hasClickedPoints())
{
QList&lt;Geometry*&gt; pp = geom-&gt;clickedPoints();
<span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i&lt;pp.size(); i++)
{
QMessageBox::information(<span class="keyword">this</span>, geom-&gt;name(), pp.at(i)-&gt;name());
}
}
<span class="keywordflow">else</span> <span class="keywordflow">if</span> (geom-&gt;GeometryType == <span class="stringliteral">"Point"</span>)
{
QMessageBox::information(<span class="keyword">this</span>, geom-&gt;name(), QString(<span class="stringliteral">"Position: "</span>).append(QString().setNum(((Point*)geom)-&gt;longitude())).append(QString(<span class="stringliteral">"/"</span>)).append(QString().setNum(((Point*)geom)-&gt;latitude())));
}
}
Multidemo::~Multidemo()
{
}
<span class="keywordtype">void</span> Multidemo::keyPressEvent(QKeyEvent* evnt)
{
<span class="keywordflow">if</span> (evnt-&gt;key() == 49 || evnt-&gt;key() == 17825792) <span class="comment">// keyboard '1'</span>
{
mc-&gt;zoomIn();
}
<span class="keywordflow">else</span> <span class="keywordflow">if</span> (evnt-&gt;key() == 50)
{
mc-&gt;moveTo(QPointF(8.25, 60));
}
<span class="keywordflow">else</span> <span class="keywordflow">if</span> (evnt-&gt;key() == 51 || evnt-&gt;key() == 16777313) <span class="comment">// keyboard '3'</span>
{
mc-&gt;zoomOut();
}
<span class="keywordflow">else</span> <span class="keywordflow">if</span> (evnt-&gt;key() == 52) <span class="comment">//4</span>
{
mc-&gt;updateRequestNew();
}
<span class="keywordflow">else</span> <span class="keywordflow">if</span> (evnt-&gt;key() == 16777234) <span class="comment">// left</span>
{
mc-&gt;scrollLeft();
}
<span class="keywordflow">else</span> <span class="keywordflow">if</span> (evnt-&gt;key() == 16777236) <span class="comment">// right</span>
{
mc-&gt;scrollRight();
}
<span class="keywordflow">else</span> <span class="keywordflow">if</span> (evnt-&gt;key() == 16777235 ) <span class="comment">// up</span>
{
mc-&gt;scrollUp();
}
<span class="keywordflow">else</span> <span class="keywordflow">if</span> (evnt-&gt;key() == 16777237) <span class="comment">// down</span>
{
mc-&gt;scrollDown();
}
<span class="keywordflow">else</span> <span class="keywordflow">if</span> (evnt-&gt;key() == 48 || evnt-&gt;key() == 17825797) <span class="comment">// 0</span>
{
emit(close());
}
}
<span class="keywordtype">void</span> Multidemo::buttonToggled(<span class="keywordtype">bool</span> active)
{
<span class="keywordflow">if</span> (active)
mc-&gt;setMouseMode(MapControl::Dragging);
<span class="keywordflow">else</span>
mc-&gt;setMouseMode(MapControl::Panning);
}
<span class="keywordtype">void</span> Multidemo::toggleFollow(<span class="keywordtype">bool</span> follow)
{
<span class="keywordflow">if</span> (follow)
mc-&gt;followGeometry(ip);
<span class="keywordflow">else</span>
mc-&gt;stopFollowing(ip);
}
<span class="keywordtype">void</span> Multidemo::toggleGPS(<span class="keywordtype">bool</span> gps)
{
<span class="keywordflow">if</span> (gps)
gm-&gt;start();
<span class="keywordflow">else</span>
gm-&gt;stop();
}
<span class="keywordtype">void</span> Multidemo::draggedRect(QRectF rect)
{
QList&lt;QPointF&gt; coords;
coords.append(rect.topLeft());
coords.append(rect.bottomRight());
mc-&gt;setViewAndZoomIn(coords);
}
<span class="keywordtype">void</span> Multidemo::mouseEventCoordinate(<span class="keyword">const</span> QMouseEvent* evnt, <span class="keyword">const</span> QPointF coordinate)
{
<span class="keywordflow">if</span> (evnt-&gt;type() == QEvent::MouseButtonPress &amp;&amp; btn3-&gt;isChecked())
{
mc-&gt;moveTo(coordinate);
}
<span class="comment">//update mini-window</span>
<span class="keywordflow">else</span> <span class="keywordflow">if</span>(evnt-&gt;type() == QEvent::MouseButtonRelease)
{
mc2-&gt;setView(mc-&gt;currentCoordinate());
}
}
<span class="keywordtype">void</span> Multidemo::coordinateClicked_mc2(<span class="keyword">const</span> QMouseEvent* evnt, <span class="keyword">const</span> QPointF coordinate)
{
<span class="keywordflow">if</span> (evnt-&gt;type() == QEvent::MouseButtonPress)
{
mc2-&gt;moveTo(coordinate);
mc-&gt;setView(coordinate);
}
}
</pre></div> </div>
<hr size="1"><address style="text-align: right;"><small>Generated on Wed Jul 29 12:38:09 2009 for QMapControl by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.9 </small></address>
</body>
</html>