measure_ellipsoid.diff
| src/app/qgsmeasuredialog.h (working copy) | ||
|---|---|---|
| 62 | 62 | |
| 63 | 63 |
//! Show the help for the dialog |
| 64 | 64 |
void on_buttonBox_helpRequested() { QgsContextHelp::run( metaObject()->className() ); }
|
| 65 |
private slots: |
|
| 66 |
//! on change state projection enable |
|
| 67 |
void changeStateProjectionEnable(); |
|
| 65 | 68 | |
| 66 | 69 |
private: |
| 67 | 70 | |
| src/app/qgsdisplayangle.h (working copy) | ||
|---|---|---|
| 29 | 29 |
/**Sets the measured angle value (in radians). The value is going to |
| 30 | 30 |
be converted to degrees / gon automatically if necessary*/ |
| 31 | 31 |
void setValueInRadians( double value ); |
| 32 | ||
| 33 |
bool projectionEnabled(); |
|
| 34 | ||
| 35 |
signals: |
|
| 36 |
void changeStateProjectionEnable(); |
|
| 37 |
|
|
| 38 |
private slots: |
|
| 39 |
void changeState(); |
|
| 40 | ||
| 32 | 41 |
}; |
| 33 | 42 | |
| 34 | 43 |
#endif // QGSDISPLAYANGLE_H |
| src/app/qgsdisplayangle.cpp (working copy) | ||
|---|---|---|
| 20 | 20 |
QgsDisplayAngle::QgsDisplayAngle( QWidget * parent, Qt::WindowFlags f ): QDialog( parent, f ) |
| 21 | 21 |
{
|
| 22 | 22 |
setupUi( this ); |
| 23 |
QSettings settings; |
|
| 24 |
int s = settings.value( "/qgis/measure/projection_enable", "2" ).toInt(); |
|
| 25 |
if ( s == 2 ) |
|
| 26 |
mcbProjectionEnabled->setCheckState( Qt::Checked ); |
|
| 27 |
else |
|
| 28 |
mcbProjectionEnabled->setCheckState( Qt::Unchecked ); |
|
| 29 | ||
| 30 |
connect( mcbProjectionEnabled, SIGNAL( stateChanged(int) ), |
|
| 31 |
this, SLOT( changeState() ) ); |
|
| 32 |
connect( mcbProjectionEnabled, SIGNAL( stateChanged(int) ), |
|
| 33 |
this, SIGNAL( changeStateProjectionEnable() ) ); |
|
| 23 | 34 |
} |
| 24 | 35 | |
| 25 | 36 |
QgsDisplayAngle::~QgsDisplayAngle() |
| ... | ... | |
| 27 | 38 | |
| 28 | 39 |
} |
| 29 | 40 | |
| 41 |
bool QgsDisplayAngle::projectionEnabled() |
|
| 42 |
{
|
|
| 43 |
return mcbProjectionEnabled->isChecked(); |
|
| 44 |
} |
|
| 45 | ||
| 30 | 46 |
void QgsDisplayAngle::setValueInRadians( double value ) |
| 31 | 47 |
{
|
| 32 | 48 |
QSettings settings; |
| ... | ... | |
| 45 | 61 |
} |
| 46 | 62 |
} |
| 47 | 63 | |
| 64 |
void QgsDisplayAngle::changeState() |
|
| 65 |
{
|
|
| 66 |
QSettings settings; |
|
| 67 |
if ( mcbProjectionEnabled->isChecked() ) |
|
| 68 |
settings.setValue( "/qgis/measure/projection_enable", 2); |
|
| 69 |
else |
|
| 70 |
settings.setValue( "/qgis/measure/projection_enable", 0); |
|
| 71 |
} |
|
| src/app/qgsmeasuredialog.cpp (working copy) | ||
|---|---|---|
| 52 | 52 |
//mTable->setHeaderLabels(QStringList() << tr("Segments (in meters)") << tr("Total") << tr("Azimuth") );
|
| 53 | 53 | |
| 54 | 54 |
QSettings settings; |
| 55 |
int s = settings.value( "/qgis/measure/projection_enable", "2" ).toInt(); |
|
| 56 |
if ( s == 2 ) |
|
| 57 |
mcbProjectionEnabled->setCheckState( Qt::Checked ); |
|
| 58 |
else |
|
| 59 |
mcbProjectionEnabled->setCheckState( Qt::Unchecked ); |
|
| 55 | 60 | |
| 61 |
connect( mcbProjectionEnabled, SIGNAL( stateChanged(int) ), |
|
| 62 |
this, SLOT( changeStateProjectionEnable() )); |
|
| 56 | 63 | |
| 57 | 64 |
updateUi(); |
| 58 | 65 |
} |
| ... | ... | |
| 91 | 98 |
QSettings settings; |
| 92 | 99 |
int decimalPlaces = settings.value( "/qgis/measure/decimalplaces", "3" ).toInt(); |
| 93 | 100 | |
| 101 |
// Create QgsDistance Area for customization ProjectionEnabled setting |
|
| 102 |
QgsDistanceArea myDa; |
|
| 103 |
myDa.setSourceCrs( mTool->canvas()->mapRenderer()->destinationSrs().srsid() ); |
|
| 104 |
myDa.setEllipsoid( mTool->canvas()->mapRenderer()->distanceArea()->ellipsoid() ); |
|
| 105 |
myDa.setProjectionsEnabled( mcbProjectionEnabled->isChecked() ); |
|
| 106 | ||
| 94 | 107 |
// show current distance/area while moving the point |
| 95 | 108 |
// by creating a temporary copy of point array |
| 96 |
// and adding moving point at the end |
|
| 109 |
// and adding moving point at the end
|
|
| 97 | 110 |
if ( mMeasureArea && mTool->points().size() > 1 ) |
| 98 | 111 |
{
|
| 99 | 112 |
QList<QgsPoint> tmpPoints = mTool->points(); |
| 100 | 113 |
tmpPoints.append( point ); |
| 101 |
double area = mTool->canvas()->mapRenderer()->distanceArea()->measurePolygon( tmpPoints );
|
|
| 114 |
double area = myDa.measurePolygon( tmpPoints );
|
|
| 102 | 115 |
editTotal->setText( formatArea( area, decimalPlaces ) ); |
| 103 | 116 |
} |
| 104 | 117 |
else if ( !mMeasureArea && mTool->points().size() > 0 ) |
| 105 | 118 |
{
|
| 106 | 119 |
QgsPoint p1( mTool->points().last() ), p2( point ); |
| 107 | 120 | |
| 108 |
double d = mTool->canvas()->mapRenderer()->distanceArea()->measureLine( p1, p2 );
|
|
| 121 |
double d = myDa.measureLine( p1, p2 );
|
|
| 109 | 122 |
editTotal->setText( formatDistance( mTotal + d, decimalPlaces ) ); |
| 110 | 123 |
QGis::UnitType myDisplayUnits; |
| 111 | 124 |
// Ignore units |
| ... | ... | |
| 120 | 133 |
QSettings settings; |
| 121 | 134 |
int decimalPlaces = settings.value( "/qgis/measure/decimalplaces", "3" ).toInt(); |
| 122 | 135 | |
| 136 |
// Create QgsDistance Area for customization ProjectionEnabled setting |
|
| 137 |
QgsDistanceArea myDa; |
|
| 138 |
myDa.setSourceCrs( mTool->canvas()->mapRenderer()->destinationSrs().srsid() ); |
|
| 139 |
myDa.setEllipsoid( mTool->canvas()->mapRenderer()->distanceArea()->ellipsoid() ); |
|
| 140 |
myDa.setProjectionsEnabled( mcbProjectionEnabled->isChecked() ); |
|
| 141 | ||
| 123 | 142 |
int numPoints = mTool->points().size(); |
| 124 | 143 |
if ( mMeasureArea && numPoints > 2 ) |
| 125 | 144 |
{
|
| 126 |
double area = mTool->canvas()->mapRenderer()->distanceArea()->measurePolygon( mTool->points() );
|
|
| 145 |
double area = myDa.measurePolygon( mTool->points() );
|
|
| 127 | 146 |
editTotal->setText( formatArea( area, decimalPlaces ) ); |
| 128 | 147 |
} |
| 129 | 148 |
else if ( !mMeasureArea && numPoints > 1 ) |
| ... | ... | |
| 132 | 151 | |
| 133 | 152 |
QgsPoint p1 = mTool->points()[last], p2 = mTool->points()[last+1]; |
| 134 | 153 | |
| 135 |
double d = mTool->canvas()->mapRenderer()->distanceArea()->measureLine( p1, p2 );
|
|
| 154 |
double d = myDa.measureLine( p1, p2 );
|
|
| 136 | 155 | |
| 137 | 156 |
mTotal += d; |
| 138 | 157 |
editTotal->setText( formatDistance( mTotal, decimalPlaces ) ); |
| ... | ... | |
| 252 | 271 |
QGis::UnitType myUnits = mTool->canvas()->mapUnits(); |
| 253 | 272 |
if (( myUnits == QGis::Degrees || myUnits == QGis::Feet ) && |
| 254 | 273 |
mTool->canvas()->mapRenderer()->distanceArea()->ellipsoid() != "NONE" && |
| 255 |
mTool->canvas()->mapRenderer()->distanceArea()->hasCrsTransformEnabled() )
|
|
| 274 |
mcbProjectionEnabled->isChecked() )
|
|
| 256 | 275 |
{
|
| 257 | 276 |
// Measuring on an ellipsoid returns meters, and so does using projections??? |
| 258 | 277 |
myUnits = QGis::Meters; |
| 259 | 278 |
QgsDebugMsg( "We're measuring on an ellipsoid or using projections, the system is returning meters" ); |
| 260 | 279 |
} |
| 261 | ||
| 280 |
|
|
| 262 | 281 |
// Get the units for display |
| 263 | 282 |
QSettings settings; |
| 264 | 283 |
QString myDisplayUnitsTxt = settings.value( "/qgis/measure/displayunits", "meters" ).toString(); |
| 265 | ||
| 284 |
|
|
| 266 | 285 |
// Only convert between meters and feet |
| 267 | 286 |
if ( myUnits == QGis::Meters && myDisplayUnitsTxt == "feet" ) |
| 268 | 287 |
{
|
| ... | ... | |
| 289 | 308 | |
| 290 | 309 |
u = myUnits; |
| 291 | 310 |
} |
| 311 | ||
| 312 |
void QgsMeasureDialog::changeStateProjectionEnable() |
|
| 313 |
{
|
|
| 314 |
// store value |
|
| 315 |
QSettings settings; |
|
| 316 |
if ( mcbProjectionEnabled->isChecked() ) |
|
| 317 |
settings.setValue( "/qgis/measure/projection_enable", 2); |
|
| 318 |
else |
|
| 319 |
settings.setValue( "/qgis/measure/projection_enable", 0); |
|
| 320 | ||
| 321 |
// clear interface |
|
| 322 |
mTable->clear(); |
|
| 323 |
QTreeWidgetItem* item = new QTreeWidgetItem( QStringList( QString::number( 0, 'f', 1 ) ) ); |
|
| 324 |
item->setTextAlignment( 0, Qt::AlignRight ); |
|
| 325 |
mTable->addTopLevelItem( item ); |
|
| 326 |
mTotal = 0; |
|
| 327 |
updateUi(); |
|
| 328 | ||
| 329 |
int decimalPlaces = settings.value( "/qgis/measure/decimalplaces", "3" ).toInt(); |
|
| 330 |
|
|
| 331 |
// create DistanceArea |
|
| 332 |
QgsDistanceArea myDa; |
|
| 333 |
myDa.setSourceCrs( mTool->canvas()->mapRenderer()->destinationSrs().srsid() ); |
|
| 334 |
myDa.setEllipsoid( mTool->canvas()->mapRenderer()->distanceArea()->ellipsoid() ); |
|
| 335 |
myDa.setProjectionsEnabled( mcbProjectionEnabled->isChecked() ); |
|
| 336 |
|
|
| 337 |
if ( mMeasureArea ) |
|
| 338 |
{
|
|
| 339 |
double area = 0.0; |
|
| 340 |
if ( mTool->points().size() > 1 ) |
|
| 341 |
{
|
|
| 342 |
area = myDa.measurePolygon( mTool->points() ); |
|
| 343 |
} |
|
| 344 |
editTotal->setText( formatArea( area, decimalPlaces ) ); |
|
| 345 |
}else |
|
| 346 |
{
|
|
| 347 |
QList<QgsPoint>::const_iterator it; |
|
| 348 |
bool b = true; // first point |
|
| 349 |
|
|
| 350 |
QgsPoint p1,p2; |
|
| 351 |
|
|
| 352 |
for (it=mTool->points().constBegin(); it != mTool->points().constEnd(); ++it) |
|
| 353 |
{
|
|
| 354 |
p2 = *it; |
|
| 355 |
if ( !b ) |
|
| 356 |
{
|
|
| 357 |
double d = myDa.measureLine( p1, p2 ); |
|
| 358 |
mTotal += d; |
|
| 359 |
editTotal->setText( formatDistance( mTotal, decimalPlaces ) ); |
|
| 360 |
QGis::UnitType myDisplayUnits; |
|
| 361 | ||
| 362 |
convertMeasurement( d, myDisplayUnits, false ); |
|
| 363 | ||
| 364 |
QTreeWidgetItem *item = mTable->topLevelItem( mTable->topLevelItemCount() - 1 ); |
|
| 365 |
item->setText( 0, QLocale::system().toString( d, 'f', decimalPlaces ) ); |
|
| 366 |
item = new QTreeWidgetItem( QStringList( QLocale::system().toString( 0.0, 'f', decimalPlaces ) ) ); |
|
| 367 |
item->setTextAlignment( 0, Qt::AlignRight ); |
|
| 368 |
mTable->addTopLevelItem( item ); |
|
| 369 |
mTable->scrollToItem( item ); |
|
| 370 |
} |
|
| 371 |
p1 = p2; |
|
| 372 |
b = false; |
|
| 373 |
} |
|
| 374 |
} |
|
| 375 |
} |
|
| src/app/qgsmaptoolmeasureangle.h (working copy) | ||
|---|---|---|
| 59 | 59 |
/**Deletes the rubber band and the dialog*/ |
| 60 | 60 |
void stopMeasuring(); |
| 61 | 61 | |
| 62 |
/** recalculate angle if projection state changed*/ |
|
| 63 |
void changeStateProjectionEnable(); |
|
| 64 | ||
| 62 | 65 |
}; |
| 63 | 66 | |
| 64 | 67 |
#endif // QGSMAPTOOLMEASUREANGLE_H |
| src/app/qgsmaptoolmeasureangle.cpp (working copy) | ||
|---|---|---|
| 49 | 49 |
QgsDistanceArea* distArea = mCanvas->mapRenderer()->distanceArea(); |
| 50 | 50 |
if ( distArea ) |
| 51 | 51 |
{
|
| 52 |
double azimutOne = distArea->bearing( mAnglePoints.at( 1 ), mAnglePoints.at( 0 ) ); |
|
| 53 |
double azimutTwo = distArea->bearing( mAnglePoints.at( 1 ), point ); |
|
| 52 |
//show angle in dialog |
|
| 53 |
if ( !mResultDisplay ) |
|
| 54 |
{
|
|
| 55 |
mResultDisplay = new QgsDisplayAngle( mCanvas->topLevelWidget() ); |
|
| 56 |
QObject::connect( mResultDisplay, SIGNAL( rejected() ), this, SLOT( stopMeasuring() ) ); |
|
| 57 |
QObject::connect( mResultDisplay, SIGNAL( changeStateProjectionEnable() ), |
|
| 58 |
this, SLOT( changeStateProjectionEnable() ) ); |
|
| 59 |
mResultDisplay->move( e->pos() - QPoint( 100, 100 ) ); |
|
| 60 |
} |
|
| 61 |
mResultDisplay->show(); |
|
| 62 |
|
|
| 63 |
QgsDistanceArea myDa; |
|
| 64 |
myDa.setSourceCrs( mCanvas->mapRenderer()->destinationSrs().srsid() ); |
|
| 65 |
myDa.setEllipsoid( distArea->ellipsoid() ); |
|
| 66 |
myDa.setProjectionsEnabled( mResultDisplay->projectionEnabled() ); |
|
| 67 | ||
| 68 |
//angle calculation |
|
| 69 |
double azimutOne = myDa.bearing( mAnglePoints.at( 1 ), mAnglePoints.at( 0 ) ); |
|
| 70 |
double azimutTwo = myDa.bearing( mAnglePoints.at( 1 ), point ); |
|
| 54 | 71 |
double resultAngle = azimutTwo - azimutOne; |
| 55 | 72 |
QgsDebugMsg( QString::number( qAbs( resultAngle ) ) ); |
| 56 | 73 |
QgsDebugMsg( QString::number( M_PI ) ); |
| ... | ... | |
| 66 | 83 |
} |
| 67 | 84 |
} |
| 68 | 85 | |
| 69 |
//show angle in dialog |
|
| 70 |
if ( !mResultDisplay ) |
|
| 71 |
{
|
|
| 72 |
mResultDisplay = new QgsDisplayAngle( mCanvas->topLevelWidget() ); |
|
| 73 |
QObject::connect( mResultDisplay, SIGNAL( rejected() ), this, SLOT( stopMeasuring() ) ); |
|
| 74 |
mResultDisplay->move( e->pos() - QPoint( 100, 100 ) ); |
|
| 75 |
} |
|
| 76 |
mResultDisplay->show(); |
|
| 77 | 86 |
mResultDisplay->setValueInRadians( resultAngle ); |
| 78 | 87 |
} |
| 79 | 88 |
} |
| ... | ... | |
| 145 | 154 |
} |
| 146 | 155 |
} |
| 147 | 156 | |
| 157 |
void QgsMapToolMeasureAngle::changeStateProjectionEnable() |
|
| 158 |
{
|
|
| 159 |
if ( mAnglePoints.size() != 3 ) |
|
| 160 |
return; |
|
| 161 |
if ( !mResultDisplay ) |
|
| 162 |
return; |
|
| 163 |
|
|
| 164 |
QgsDistanceArea myDa; |
|
| 165 |
myDa.setSourceCrs( mCanvas->mapRenderer()->destinationSrs().srsid() ); |
|
| 166 |
myDa.setEllipsoid( mCanvas->mapRenderer()->distanceArea()->ellipsoid() ); |
|
| 167 |
myDa.setProjectionsEnabled( mResultDisplay->projectionEnabled() ); |
|
| 148 | 168 | |
| 169 |
//angle calculation |
|
| 170 |
double azimutOne = myDa.bearing( mAnglePoints.at( 1 ), mAnglePoints.at( 0 ) ); |
|
| 171 |
double azimutTwo = myDa.bearing( mAnglePoints.at( 1 ), mAnglePoints.at( 2 ) ); |
|
| 172 |
double resultAngle = azimutTwo - azimutOne; |
|
| 173 |
QgsDebugMsg( QString::number( fabs( resultAngle ) ) ); |
|
| 174 |
QgsDebugMsg( QString::number( M_PI ) ); |
|
| 175 |
if ( fabs( resultAngle ) > M_PI ) |
|
| 176 |
{
|
|
| 177 |
if ( resultAngle < 0 ) |
|
| 178 |
{
|
|
| 179 |
resultAngle = M_PI + ( resultAngle + M_PI ); |
|
| 180 |
} |
|
| 181 |
else |
|
| 182 |
{
|
|
| 183 |
resultAngle = -M_PI + ( resultAngle - M_PI ); |
|
| 184 |
} |
|
| 185 |
} |
|
| 186 |
mResultDisplay->setValueInRadians( resultAngle ); |
|
| 149 | 187 | |
| 188 |
} |
|
| 189 | ||
| src/ui/qgsmeasurebase.ui (working copy) | ||
|---|---|---|
| 31 | 31 |
<property name="spacing"> |
| 32 | 32 |
<number>6</number> |
| 33 | 33 |
</property> |
| 34 |
<item row="1" column="2">
|
|
| 34 |
<item row="2" column="2">
|
|
| 35 | 35 |
<widget class="QLineEdit" name="editTotal"> |
| 36 | 36 |
<property name="font"> |
| 37 | 37 |
<font> |
| ... | ... | |
| 47 | 47 |
</property> |
| 48 | 48 |
</widget> |
| 49 | 49 |
</item> |
| 50 |
<item row="1" column="1">
|
|
| 50 |
<item row="2" column="1">
|
|
| 51 | 51 |
<spacer> |
| 52 | 52 |
<property name="orientation"> |
| 53 | 53 |
<enum>Qt::Horizontal</enum> |
| ... | ... | |
| 63 | 63 |
</property> |
| 64 | 64 |
</spacer> |
| 65 | 65 |
</item> |
| 66 |
<item row="1" column="0">
|
|
| 66 |
<item row="2" column="0">
|
|
| 67 | 67 |
<widget class="QLabel" name="textLabel2"> |
| 68 | 68 |
<property name="text"> |
| 69 | 69 |
<string>Total</string> |
| ... | ... | |
| 73 | 73 |
</property> |
| 74 | 74 |
</widget> |
| 75 | 75 |
</item> |
| 76 |
<item row="0" column="0" colspan="3">
|
|
| 76 |
<item row="1" column="0" colspan="3">
|
|
| 77 | 77 |
<widget class="QTreeWidget" name="mTable"> |
| 78 | 78 |
<property name="editTriggers"> |
| 79 | 79 |
<set>QAbstractItemView::NoEditTriggers</set> |
| ... | ... | |
| 91 | 91 |
</column> |
| 92 | 92 |
</widget> |
| 93 | 93 |
</item> |
| 94 |
<item row="2" column="2">
|
|
| 94 |
<item row="3" column="2">
|
|
| 95 | 95 |
<widget class="QDialogButtonBox" name="buttonBox"> |
| 96 | 96 |
<property name="standardButtons"> |
| 97 | 97 |
<set>QDialogButtonBox::Close|QDialogButtonBox::Help</set> |
| 98 | 98 |
</property> |
| 99 | 99 |
</widget> |
| 100 | 100 |
</item> |
| 101 |
<item row="0" column="0" colspan="3"> |
|
| 102 |
<widget class="QCheckBox" name="mcbProjectionEnabled"> |
|
| 103 |
<property name="text"> |
|
| 104 |
<string>Ellipsoidal (WGS84)</string> |
|
| 105 |
</property> |
|
| 106 |
</widget> |
|
| 107 |
</item> |
|
| 101 | 108 |
</layout> |
| 102 | 109 |
</widget> |
| 103 | 110 |
<layoutdefault spacing="6" margin="11"/> |
| src/ui/qgsdisplayanglebase.ui (working copy) | ||
|---|---|---|
| 6 | 6 |
<rect> |
| 7 | 7 |
<x>0</x> |
| 8 | 8 |
<y>0</y> |
| 9 |
<width>276</width>
|
|
| 10 |
<height>78</height>
|
|
| 9 |
<width>293</width>
|
|
| 10 |
<height>105</height>
|
|
| 11 | 11 |
</rect> |
| 12 | 12 |
</property> |
| 13 | 13 |
<property name="windowTitle"> |
| 14 | 14 |
<string>Angle</string> |
| 15 | 15 |
</property> |
| 16 | 16 |
<layout class="QGridLayout" name="gridLayout"> |
| 17 |
<item row="0" column="0" colspan="2">
|
|
| 17 |
<item row="1" column="0" colspan="2">
|
|
| 18 | 18 |
<widget class="QLineEdit" name="mAngleLineEdit"> |
| 19 | 19 |
<property name="readOnly"> |
| 20 | 20 |
<bool>true</bool> |
| 21 | 21 |
</property> |
| 22 | 22 |
</widget> |
| 23 | 23 |
</item> |
| 24 |
<item row="1" column="0">
|
|
| 24 |
<item row="2" column="0">
|
|
| 25 | 25 |
<spacer name="horizontalSpacer"> |
| 26 | 26 |
<property name="orientation"> |
| 27 | 27 |
<enum>Qt::Horizontal</enum> |
| ... | ... | |
| 34 | 34 |
</property> |
| 35 | 35 |
</spacer> |
| 36 | 36 |
</item> |
| 37 |
<item row="1" column="1">
|
|
| 37 |
<item row="2" column="1">
|
|
| 38 | 38 |
<widget class="QDialogButtonBox" name="buttonBox"> |
| 39 | 39 |
<property name="orientation"> |
| 40 | 40 |
<enum>Qt::Horizontal</enum> |
| ... | ... | |
| 44 | 44 |
</property> |
| 45 | 45 |
</widget> |
| 46 | 46 |
</item> |
| 47 |
<item row="0" column="0"> |
|
| 48 |
<widget class="QCheckBox" name="mcbProjectionEnabled"> |
|
| 49 |
<property name="text"> |
|
| 50 |
<string>Ellipsoidal (WGS84)</string> |
|
| 51 |
</property> |
|
| 52 |
</widget> |
|
| 53 |
</item> |
|
| 47 | 54 |
</layout> |
| 48 | 55 |
</widget> |
| 49 | 56 |
<resources/> |