Skip to content

Commit f5486ee

Browse files
committedOct 15, 2018
Add single geometry check
1 parent 574c672 commit f5486ee

12 files changed

+471
-13
lines changed
 

‎src/app/CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ SET(QGIS_APP_SRCS
4848
qgsdisplayangle.cpp
4949
qgsfieldcalculator.cpp
5050
qgsfirstrundialog.cpp
51+
qgsgeometryvalidationservice.cpp
52+
qgsgeometryvalidationdock.cpp
53+
qgsgeometryvalidationmodel.cpp
5154
qgssourcefieldsproperties.cpp
5255
qgsattributesformproperties.cpp
5356
qgsidentifyresultsdialog.cpp
@@ -276,6 +279,9 @@ SET (QGIS_APP_MOC_HDRS
276279
qgsattributesformproperties.h
277280
qgsformannotationdialog.h
278281
qgsguivectorlayertools.h
282+
qgsgeometryvalidationservice.h
283+
qgsgeometryvalidationdock.h
284+
qgsgeometryvalidationmodel.h
279285
qgshtmlannotationdialog.h
280286
qgsidentifyresultsdialog.h
281287
qgslabelengineconfigdialog.h
@@ -692,6 +698,7 @@ INCLUDE_DIRECTORIES(SYSTEM
692698
INCLUDE_DIRECTORIES(
693699
../analysis/processing
694700
../analysis/raster
701+
../analysis/vector/geometry_checker
695702
../core
696703
../core/annotations
697704
../core/auth

‎src/app/qgisapp.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
#include "qgsziputils.h"
8080
#include "qgsbrowsermodel.h"
8181
#include "qgsvectorlayerjoinbuffer.h"
82+
#include "qgsgeometryvalidationservice.h"
8283

8384
#ifdef HAVE_3D
8485
#include "qgsabstract3drenderer.h"
@@ -406,6 +407,8 @@ Q_GUI_EXPORT extern int qt_defaultDpiX();
406407
#include "qgsmaptoolrotatelabel.h"
407408
#include "qgsmaptoolchangelabelproperties.h"
408409
#include "qgsmaptoolreverseline.h"
410+
#include "qgsgeometryvalidationmodel.h"
411+
#include "qgsgeometryvalidationdock.h"
409412

410413
#include "vertextool/qgsvertextool.h"
411414

@@ -778,7 +781,6 @@ QgisApp::QgisApp( QSplashScreen *splash, bool restorePlugins, bool skipVersionCh
778781
// what type of project to auto-open
779782
mProjOpen = settings.value( QStringLiteral( "qgis/projOpenAtLaunch" ), 0 ).toInt();
780783

781-
782784
startProfile( QStringLiteral( "Welcome page" ) );
783785
mWelcomePage = new QgsWelcomePage( skipVersionCheck );
784786
connect( mWelcomePage, &QgsWelcomePage::projectRemoved, this, [ this ]( int row )
@@ -919,6 +921,14 @@ QgisApp::QgisApp( QSplashScreen *splash, bool restorePlugins, bool skipVersionCh
919921
functionProfile( &QgisApp::initNativeProcessing, this, QStringLiteral( "Initialize native processing" ) );
920922
functionProfile( &QgisApp::initLayouts, this, QStringLiteral( "Initialize layouts support" ) );
921923

924+
startProfile( QStringLiteral( "Geometry validation" ) );
925+
mGeometryValidationService = qgis::make_unique<QgsGeometryValidationService>( QgsProject::instance() );
926+
mGeometryValidationDock = new QgsGeometryValidationDock( tr( "Geometry Validation" ) );
927+
mGeometryValidationModel = new QgsGeometryValidationModel( mGeometryValidationService.get(), mGeometryValidationDock );
928+
mGeometryValidationDock->setGeometryValidationModel( mGeometryValidationModel );
929+
addDockWidget( Qt::RightDockWidgetArea, mGeometryValidationDock );
930+
endProfile();
931+
922932
QgsApplication::annotationRegistry()->addAnnotationType( QgsAnnotationMetadata( QStringLiteral( "FormAnnotationItem" ), &QgsFormAnnotation::create ) );
923933
connect( QgsProject::instance()->annotationManager(), &QgsAnnotationManager::annotationAdded, this, &QgisApp::annotationCreated );
924934

‎src/app/qgisapp.h

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ class QgsVectorLayerTools;
101101
class QgsWelcomePage;
102102
class QgsOptionsWidgetFactory;
103103
class QgsStatusBar;
104+
class QgsGeometryValidationService;
105+
class QgsGeometryValidationDock;
106+
class QgsGeometryValidationModel;
104107
class QgsUserProfileManagerWidgetFactory;
105108
class Qgs3DMapCanvasDockWidget;
106109

@@ -114,6 +117,7 @@ class QgsAdvancedDigitizingDockWidget;
114117
class QgsGpsInformationWidget;
115118
class QgsStatisticalSummaryDockWidget;
116119
class QgsMapCanvasTracer;
120+
117121
class QgsDecorationItem;
118122
class QgsMessageLogViewer;
119123
class QgsMessageBar;
@@ -690,13 +694,6 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
690694
//! Returns pointer to the identify map tool - used by identify tool in 3D view
691695
QgsMapToolIdentifyAction *identifyMapTool() const { return mMapTools.mIdentify; }
692696

693-
/**
694-
* Take screenshots for user documentation
695-
* @param saveDirectory path were the screenshots will be saved
696-
* @param categories an int as a flag value of QgsAppScreenShots::Categories
697-
*/
698-
void takeAppScreenShots( const QString &saveDirectory, const int categories = 0 );
699-
700697
public slots:
701698
//! save current vector layer
702699
void saveAsFile( QgsMapLayer *layer = nullptr, bool onlySelected = false );
@@ -1970,9 +1967,6 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
19701967
//! Populates project "load from" / "save to" menu based on project storages (when the menu is about to be shown)
19711968
void populateProjectStorageMenu( QMenu *menu, bool saving );
19721969

1973-
//! Create the option dialog
1974-
QgsOptions *createOptionsDialog( QWidget *parent = nullptr );
1975-
19761970
QgisAppStyleSheet *mStyleSheetBuilder = nullptr;
19771971

19781972
// actions for menus and toolbars -----------------
@@ -2145,6 +2139,7 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
21452139

21462140
//! interface to QgisApp for plugins
21472141
QgisAppInterface *mQgisInterface = nullptr;
2142+
friend class QgisAppInterface;
21482143

21492144
QSplashScreen *mSplash = nullptr;
21502145
//! list of recently opened/saved project files
@@ -2311,8 +2306,6 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
23112306
bool mBlockActiveLayerChanged = false;
23122307

23132308
friend class TestQgisAppPython;
2314-
friend class QgisAppInterface;
2315-
friend class QgsAppScreenShots;
23162309
};
23172310

23182311
#ifdef ANDROID

‎src/app/qgsgeometryvalidationdock.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/***************************************************************************
2+
qgsgeometryvalidationdock.cpp
3+
--------------------------------------
4+
Date : 7.9.2018
5+
Copyright : (C) 2018 by Matthias Kuhn
6+
email : matthias@opengis.ch
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
16+
#include "qgsgeometryvalidationdock.h"
17+
#include "qgsgeometryvalidationmodel.h"
18+
19+
QgsGeometryValidationDock::QgsGeometryValidationDock( const QString &title, QWidget *parent, Qt::WindowFlags flags )
20+
: QgsDockWidget( title, parent, flags )
21+
{
22+
setupUi( this );
23+
}
24+
25+
QgsGeometryValidationModel *QgsGeometryValidationDock::geometryValidationModel() const
26+
{
27+
return mGeometryValidationModel;
28+
}
29+
30+
void QgsGeometryValidationDock::setGeometryValidationModel( QgsGeometryValidationModel *geometryValidationModel )
31+
{
32+
mGeometryValidationModel = geometryValidationModel;
33+
}

‎src/app/qgsgeometryvalidationdock.h

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/***************************************************************************
2+
qgsgeometryvalidationdock.h
3+
--------------------------------------
4+
Date : 7.9.2018
5+
Copyright : (C) 2018 by Matthias Kuhn
6+
email : matthias@opengis.ch
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
16+
#ifndef QGSGEOMETRYVALIDATIONPANEL_H
17+
#define QGSGEOMETRYVALIDATIONPANEL_H
18+
19+
#include "ui_qgsgeometryvalidationdockbase.h"
20+
#include "qgsdockwidget.h"
21+
22+
class QgsGeometryValidationModel;
23+
24+
/**
25+
* @brief The QgsGeometryValidationDock class
26+
*/
27+
class QgsGeometryValidationDock : public QgsDockWidget, public Ui_QgsGeometryValidationDockBase
28+
{
29+
Q_OBJECT
30+
31+
public:
32+
QgsGeometryValidationDock( const QString &title, QWidget *parent = nullptr, Qt::WindowFlags flags = nullptr );
33+
34+
QgsGeometryValidationModel *geometryValidationModel() const;
35+
void setGeometryValidationModel( QgsGeometryValidationModel *geometryValidationModel );
36+
37+
private:
38+
QgsGeometryValidationModel *mGeometryValidationModel = nullptr;
39+
};
40+
41+
#endif // QGSGEOMETRYVALIDATIONPANEL_H
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#include "qgsgeometryvalidationmodel.h"
2+
3+
#include "qgsvectorlayer.h"
4+
5+
QgsGeometryValidationModel::QgsGeometryValidationModel( QgsGeometryValidationService *geometryValidationService, QObject *parent )
6+
: QAbstractItemModel( parent )
7+
, mGeometryValidationService( geometryValidationService )
8+
{
9+
10+
}
11+
12+
QModelIndex QgsGeometryValidationModel::index( int row, int column, const QModelIndex &parent ) const
13+
{
14+
Q_UNUSED( parent )
15+
return createIndex( row, column );
16+
}
17+
18+
QModelIndex QgsGeometryValidationModel::parent( const QModelIndex &child ) const
19+
{
20+
Q_UNUSED( child )
21+
return QModelIndex();
22+
}
23+
24+
int QgsGeometryValidationModel::rowCount( const QModelIndex &parent ) const
25+
{
26+
Q_UNUSED( parent )
27+
return mGeometryValidationService->featureErrors( mCurrentLayer ).size();
28+
}
29+
30+
int QgsGeometryValidationModel::columnCount( const QModelIndex &parent ) const
31+
{
32+
Q_UNUSED( parent )
33+
return 1;
34+
}
35+
36+
QVariant QgsGeometryValidationModel::data( const QModelIndex &index, int role ) const
37+
{
38+
switch ( role )
39+
{
40+
case Qt::DisplayRole:
41+
QgsGeometryValidationService::FeatureError error = mGeometryValidationService->featureError( mCurrentLayer, index.row() );
42+
QgsFeature feature = mCurrentLayer->getFeature( error.featureId );
43+
mExpressionContext.setFeature( feature );
44+
QString featureTitle = mDisplayExpression.evaluate( &mExpressionContext ).toString();
45+
return QStringLiteral( "<b>%1</b>: %2" ).arg( featureTitle, error.error.what() );
46+
}
47+
48+
return QVariant();
49+
}
50+
51+
QgsVectorLayer *QgsGeometryValidationModel::currentLayer() const
52+
{
53+
return mCurrentLayer;
54+
}
55+
56+
void QgsGeometryValidationModel::setCurrentLayer( QgsVectorLayer *currentLayer )
57+
{
58+
if ( mCurrentLayer == currentLayer )
59+
return;
60+
61+
beginResetModel();
62+
mCurrentLayer = currentLayer;
63+
mDisplayExpression = mCurrentLayer->displayExpression();
64+
mExpressionContext = QgsExpressionContext( QgsExpressionContextUtils::globalProjectLayerScopes( mCurrentLayer ) );
65+
mDisplayExpression.prepare( &mExpressionContext );
66+
endResetModel();
67+
}

‎src/app/qgsgeometryvalidationmodel.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#ifndef QGSGEOMETRYVALIDATIONMODEL_H
2+
#define QGSGEOMETRYVALIDATIONMODEL_H
3+
4+
#include <QAbstractItemModel>
5+
#include "qgsgeometryvalidationservice.h"
6+
#include "qgsexpression.h"
7+
#include "qgsexpressioncontext.h"
8+
9+
class QgsGeometryValidationModel : public QAbstractItemModel
10+
{
11+
Q_OBJECT
12+
13+
public:
14+
QgsGeometryValidationModel( QgsGeometryValidationService *geometryValidationService, QObject *parent = nullptr );
15+
QModelIndex index( int row, int column, const QModelIndex &parent ) const override;
16+
QModelIndex parent( const QModelIndex &child ) const override;
17+
int rowCount( const QModelIndex &parent ) const override;
18+
int columnCount( const QModelIndex &parent ) const override;
19+
QVariant data( const QModelIndex &index, int role ) const override;
20+
QgsVectorLayer *currentLayer() const;
21+
void setCurrentLayer( QgsVectorLayer *currentLayer );
22+
23+
private:
24+
QgsGeometryValidationService *mGeometryValidationService = nullptr;
25+
QgsVectorLayer *mCurrentLayer = nullptr;
26+
mutable QgsExpression mDisplayExpression;
27+
mutable QgsExpressionContext mExpressionContext;
28+
};
29+
30+
#endif // QGSGEOMETRYVALIDATIONMODEL_H
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
/***************************************************************************
2+
qgsgeometryvalidationservice.cpp
3+
--------------------------------------
4+
Date : 7.9.2018
5+
Copyright : (C) 2018 by Matthias Kuhn
6+
email : matthias@opengis.ch
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
16+
17+
#include "qgsgeometryvalidationservice.h"
18+
#include "qgsproject.h"
19+
#include "qgsvectorlayer.h"
20+
21+
// TODO: Replace with registry
22+
#include "qgsisvalidgeometrycheck.h"
23+
24+
QgsGeometryValidationService::QgsGeometryValidationService( QgsProject *project )
25+
{
26+
connect( project, &QgsProject::layersAdded, this, &QgsGeometryValidationService::onLayersAdded );
27+
28+
mIsValidGeometryCheck = new QgsIsValidGeometryCheck();
29+
}
30+
31+
QgsGeometryValidationService::~QgsGeometryValidationService()
32+
{
33+
delete mIsValidGeometryCheck;
34+
}
35+
36+
void QgsGeometryValidationService::onLayersAdded( const QList<QgsMapLayer *> &layers )
37+
{
38+
for ( QgsMapLayer *layer : layers )
39+
{
40+
QgsVectorLayer *vectorLayer = qobject_cast<QgsVectorLayer *>( layer );
41+
if ( vectorLayer )
42+
{
43+
connect( vectorLayer, &QgsVectorLayer::featureAdded, this, [this, vectorLayer]( QgsFeatureId fid )
44+
{
45+
onFeatureAdded( vectorLayer, fid );
46+
} );
47+
connect( vectorLayer, &QgsVectorLayer::geometryChanged, this, [this, vectorLayer]( QgsFeatureId fid, const QgsGeometry & geometry )
48+
{
49+
onGeometryChanged( vectorLayer, fid, geometry );
50+
} );
51+
connect( vectorLayer, &QgsVectorLayer::featureDeleted, this, [this, vectorLayer]( QgsFeatureId fid )
52+
{
53+
onFeatureDeleted( vectorLayer, fid );
54+
} );
55+
}
56+
}
57+
}
58+
59+
void QgsGeometryValidationService::onFeatureAdded( QgsVectorLayer *layer, QgsFeatureId fid )
60+
{
61+
emit geometryCheckStarted( layer, fid );
62+
63+
QgsFeature feature = layer->getFeature( fid );
64+
const auto errors = mIsValidGeometryCheck->collectErrors( feature );
65+
for ( const auto &error : errors )
66+
{
67+
qDebug() << error.what();
68+
}
69+
70+
emit geometryCheckCompleted( layer, fid );
71+
}
72+
73+
void QgsGeometryValidationService::onGeometryChanged( QgsVectorLayer *layer, QgsFeatureId fid, const QgsGeometry &geometry )
74+
{
75+
emit geometryCheckStarted( layer, fid );
76+
77+
QgsFeature feature = layer->getFeature( fid );
78+
const auto errors = mIsValidGeometryCheck->collectErrors( feature );
79+
for ( const auto &error : errors )
80+
{
81+
qDebug() << error.what();
82+
}
83+
84+
emit geometryCheckCompleted( layer, fid );
85+
}
86+
87+
void QgsGeometryValidationService::onFeatureDeleted( QgsVectorLayer *layer, QgsFeatureId fid )
88+
{
89+
// TODO: cleanup any ongoing validation threads.
90+
91+
emit geometryCheckCompleted( layer, fid );
92+
}
93+
94+
QgsGeometryValidationService::FeatureErrors QgsGeometryValidationService::featureErrors( QgsVectorLayer *layer ) const
95+
{
96+
return mFeatureErrors.value( layer );
97+
}
98+
99+
QgsGeometryValidationService::FeatureError QgsGeometryValidationService::featureError( QgsVectorLayer *layer, int errorIndex )
100+
{
101+
return mFeatureErrors.value( layer ).value( errorIndex );
102+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/***************************************************************************
2+
qgsgeometryvalidationservice.h
3+
--------------------------------------
4+
Date : 7.9.2018
5+
Copyright : (C) 2018 by Matthias Kuhn
6+
email : matthias@opengis.ch
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
16+
#ifndef QGSGEOMETRYVALIDATIONSERVICE_H
17+
#define QGSGEOMETRYVALIDATIONSERVICE_H
18+
19+
#include <QObject>
20+
#include <QMap>
21+
22+
#include "qgsfeature.h"
23+
24+
class QgsProject;
25+
class QgsMapLayer;
26+
class QgsVectorLayer;
27+
// TODO: Should be retrieved from registry!!
28+
class QgsIsValidGeometryCheck;
29+
30+
class QgsGeometryValidationService : public QObject
31+
{
32+
Q_OBJECT
33+
34+
public:
35+
struct FeatureError
36+
{
37+
QgsFeatureId featureId;
38+
QgsGeometry::Error error;
39+
};
40+
41+
typedef QList<FeatureError> FeatureErrors;
42+
43+
QgsGeometryValidationService( QgsProject *project );
44+
~QgsGeometryValidationService();
45+
46+
FeatureErrors featureErrors( QgsVectorLayer *layer ) const;
47+
48+
FeatureError featureError( QgsVectorLayer *layer, int errorIndex );
49+
50+
signals:
51+
void geometryCheckStarted( QgsVectorLayer *layer, QgsFeatureId fid );
52+
void geometryCheckCompleted( QgsVectorLayer *layer, QgsFeatureId fid );
53+
54+
private slots:
55+
void onLayersAdded( const QList<QgsMapLayer *> &layers );
56+
void onFeatureAdded( QgsVectorLayer *layer, QgsFeatureId fid );
57+
void onGeometryChanged( QgsVectorLayer *layer, QgsFeatureId fid, const QgsGeometry &geometry );
58+
void onFeatureDeleted( QgsVectorLayer *layer, QgsFeatureId fid );
59+
60+
private:
61+
void cancelChecks( QgsVectorLayer *layer, QgsFeatureId fid );
62+
63+
QgsIsValidGeometryCheck *mIsValidGeometryCheck;
64+
65+
QgsProject *mProject;
66+
67+
QMap<QgsVectorLayer *, bool> mActiveChecks;
68+
QMap<QgsVectorLayer *, FeatureErrors> mFeatureErrors;
69+
};
70+
71+
#endif // QGSGEOMETRYVALIDATIONSERVICE_H

‎src/core/qgsgeometrycheckqueue.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#include "qgsgeometrycheckqueue.h"
2+
3+
QgsGeometryCheckQueue::QgsGeometryCheckQueue()
4+
{
5+
6+
}

‎src/core/qgsgeometrycheckqueue.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#ifndef QGSGEOMETRYCHECKQUEUE_H
2+
#define QGSGEOMETRYCHECKQUEUE_H
3+
4+
#include <QObject>
5+
6+
class QgsGeometryCheckQueue
7+
{
8+
public:
9+
QgsGeometryCheckQueue();
10+
11+
private:
12+
13+
};
14+
15+
#endif // QGSGEOMETRYCHECKQUEUE_H
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<ui version="4.0">
3+
<class>QgsGeometryValidationDockBase</class>
4+
<widget class="QgsDockWidget" name="QgsGeometryValidationDockBase">
5+
<property name="geometry">
6+
<rect>
7+
<x>0</x>
8+
<y>0</y>
9+
<width>607</width>
10+
<height>973</height>
11+
</rect>
12+
</property>
13+
<property name="windowTitle">
14+
<string>Geometry Validation</string>
15+
</property>
16+
<widget class="QWidget" name="dockWidgetContents">
17+
<layout class="QGridLayout" name="gridLayout_2">
18+
<item row="1" column="0">
19+
<widget class="QLabel" name="mValidationRunningLabel">
20+
<property name="text">
21+
<string/>
22+
</property>
23+
</widget>
24+
</item>
25+
<item row="1" column="1">
26+
<widget class="QToolButton" name="mTopologyChecksPendingButton">
27+
<property name="text">
28+
<string>...</string>
29+
</property>
30+
<property name="icon">
31+
<iconset resource="../../images/images.qrc">
32+
<normaloff>:/images/themes/default/mIconTopologicalEditing.svg</normaloff>:/images/themes/default/mIconTopologicalEditing.svg</iconset>
33+
</property>
34+
</widget>
35+
</item>
36+
<item row="2" column="0" colspan="2">
37+
<widget class="QListView" name="mErrorListView"/>
38+
</item>
39+
</layout>
40+
</widget>
41+
</widget>
42+
<customwidgets>
43+
<customwidget>
44+
<class>QgsDockWidget</class>
45+
<extends>QDockWidget</extends>
46+
<header>qgsdockwidget.h</header>
47+
<container>1</container>
48+
</customwidget>
49+
</customwidgets>
50+
<resources>
51+
<include location="../../images/images.qrc"/>
52+
<include location="../../images/images.qrc"/>
53+
<include location="../../images/images.qrc"/>
54+
<include location="../../images/images.qrc"/>
55+
<include location="../../images/images.qrc"/>
56+
<include location="../../images/images.qrc"/>
57+
<include location="../../images/images.qrc"/>
58+
<include location="../../images/images.qrc"/>
59+
<include location="../../images/images.qrc"/>
60+
<include location="../../images/images.qrc"/>
61+
<include location="../../images/images.qrc"/>
62+
<include location="../../images/images.qrc"/>
63+
<include location="../../images/images.qrc"/>
64+
<include location="../../images/images.qrc"/>
65+
<include location="../../images/images.qrc"/>
66+
<include location="../../images/images.qrc"/>
67+
<include location="../../images/images.qrc"/>
68+
<include location="../../images/images.qrc"/>
69+
<include location="../../images/images.qrc"/>
70+
<include location="../../images/images.qrc"/>
71+
<include location="../../images/images.qrc"/>
72+
<include location="../../images/images.qrc"/>
73+
<include location="../../images/images.qrc"/>
74+
<include location="../../images/images.qrc"/>
75+
<include location="../../images/images.qrc"/>
76+
<include location="../../images/images.qrc"/>
77+
<include location="../../images/images.qrc"/>
78+
<include location="../../images/images.qrc"/>
79+
<include location="../../images/images.qrc"/>
80+
<include location="../../images/images.qrc"/>
81+
</resources>
82+
<connections/>
83+
</ui>

0 commit comments

Comments
 (0)
Please sign in to comment.