QGIS プロバイダプラグインその2:プロバイダプラグインの骨格を作成

まず、空のプロジェクトを作成して、クラスを1つ追加します。
クラス名はここでは「QgsCompassSurveyDataProvider」とします。
クラスは、QgsVectorDataProviderクラスの派生クラスにします。

作成したら、とりあえず必要なコードを記述します。
以下のコードは、ビルドエラーが出ないための最低限の記述です。

QgsCompassSurveyDataProvider.h

   1: #pragma once
   2: 
   3: #include "qgsvectordataprovider.h"
   4: 
   5: class QgsCompassSurveyDataProvider : public QgsVectorDataProvider
   6: {
   7: public:
   8: 	QgsCompassSurveyDataProvider( QString uri = QString() );
   9: 	~QgsCompassSurveyDataProvider(void);
  10: 
  11: 	virtual QgsCoordinateReferenceSystem crs();
  12: 	virtual QgsRectangle extent();
  13: 	virtual bool isValid();
  14: 	QString name() const;
  15: 	QString description() const;
  16: 	virtual void select( QgsAttributeList fetchAttributes = QgsAttributeList(),
  17:                          QgsRectangle rect = QgsRectangle(),
  18:                          bool fetchGeometry = true,
  19:                          bool useIntersect = false );
  20: 	virtual bool nextFeature( QgsFeature& feature );
  21: 	virtual QGis::WkbType geometryType() const;
  22: 	long featureCount() const;
  23: 	uint fieldCount() const;
  24: 	virtual const QgsFieldMap & fields() const;
  25: 	void rewind();
  26: 
  27: private:
  28: 	QgsRectangle mExtent;
  29: 	bool mValid;
  30: 	QgsAttributeList mAttributesToFetch;
  31: 	QgsRectangle mSelectionRectangle;
  32: 	QgsFieldMap attributeFields;
  33: }

QgsVectorDataProviderクラスは抽象クラスなので、純粋仮想関数をオーバーライドする必要があります。
また、コンストラクタはQString型の変数を引数として受け取るようにします。

クラスの宣言に合わせて、関数の定義を行っておきます。
とりあえずこの段階では最低限の定義です。

QgsCompassSurveyDataProvider.cpp

   1: #include "QgsCompassSurveyDataProvider.h"
   2: 
   3: static const QString TEXT_PROVIDER_KEY = "compasssurvey";	// このキーはQGISがプロバイダを選択する際に使用される
   4: static const QString TEXT_PROVIDER_DESCRIPTION = "Compass survey data provider";
   5: 
   6: QgsCompassSurveyDataProvider::QgsCompassSurveyDataProvider( QString uri )
   7:     : QgsVectorDataProvider( uri )
   8: {
   9: }
  10: 
  11: QgsCompassSurveyDataProvider::~QgsCompassSurveyDataProvider(void)
  12: {
  13: }
  14: 
  15: QgsCoordinateReferenceSystem QgsCompassSurveyDataProvider::crs()
  16: {
  17: 	return QgsCoordinateReferenceSystem(); // return default CRS
  18: }
  19: 
  20: QgsRectangle QgsCompassSurveyDataProvider::extent()
  21: {
  22: 	return mExtent;
  23: }
  24: 
  25: bool QgsCompassSurveyDataProvider::isValid()
  26: {
  27: 	return mValid;
  28: }
  29: 
  30: QString  QgsCompassSurveyDataProvider::name() const
  31: {
  32: 	return TEXT_PROVIDER_KEY;
  33: }
  34: 
  35: QString QgsCompassSurveyDataProvider::description() const
  36: {
  37: 	return TEXT_PROVIDER_DESCRIPTION;
  38: }
  39: 
  40: void QgsCompassSurveyDataProvider::select( QgsAttributeList fetchAttributes,
  41:                                        QgsRectangle rect,
  42:                                        bool fetchGeometry,
  43:                                        bool useIntersect )
  44: {
  45: }
  46: 
  47: bool QgsCompassSurveyDataProvider::nextFeature( QgsFeature& feature )
  48: {
  49: 	return false;
  50: }
  51: 
  52: QGis::WkbType QgsCompassSurveyDataProvider::geometryType() const
  53: {
  54: 	return QGis::WKBLineString;
  55: }
  56: 
  57: long QgsCompassSurveyDataProvider::featureCount() const
  58: {
  59: 	return 0;
  60: }
  61: 
  62: uint QgsCompassSurveyDataProvider::fieldCount() const
  63: {
  64: 	return attributeFields.size();
  65: }
  66: 
  67: const QgsFieldMap & QgsCompassSurveyDataProvider::fields() const
  68: {
  69: 	return attributeFields;
  70: }
  71: 
  72: void QgsCompassSurveyDataProvider::rewind()
  73: {
  74: }
  75: 
  76: QGISEXTERN QgsCompassSurveyDataProvider *classFactory( const QString *uri )
  77: {
  78: 	return new QgsCompassSurveyDataProvider( *uri );
  79: }
  80: 
  81: QGISEXTERN QString providerKey()
  82: {
  83: 	return TEXT_PROVIDER_KEY;
  84: }
  85: 
  86: QGISEXTERN QString description()
  87: {
  88: 	return TEXT_PROVIDER_DESCRIPTION;
  89: }
  90: 
  91: QGISEXTERN bool isProvider()
  92: {
  93: 	return true;
  94: }

下の4つの関数はプラグインがエクスポートする関数です。
このあたりはGUIプラグインと構成が似ているかと思います。
isProvider()関数でreturn trueとすることで、QGIS側はプロバイダプラグインであると認識します。

さらに、プロジェクトの設定を以下のように行います。

プロジェクトの設定(デバッグ版)

メニューサブメニュー項目設定値
全般構成の種類ダイナミック ライブラリ (.dll)
文字セット設定なし
C++全般追加のインクルードディレクトリ{QGISのソースコードディレクトリ}srcgui
{QGISのソースコードディレクトリ}srcplugins
{QGISのソースコードディレクトリ}srccore
プリプロセッサプリプロセッサの定義_WINDOWS
UNICODE
WIN32
QT_LARGEFILE_SUPPORT
_CRT_SECURE_NO_WARNINGS
QT_DLL
QT_CORE_LIB
QT_THREAD_SUPPORT
CORE_EXPORT=__declspec(dllimport)
リンカ入力追加の依存ファイルC:Qt2010.01qtlibQtCored4.lib
C:Qt2010.01qtlibqtmaind.lib
C:Qt2010.01qtlibQtGuid4.lib
C:Qt2010.01qtlibQtSql4.lib
{QGISのソースコードディレクトリ}buildsrccoreDebugqgis_core.lib
{QGISのソースコードディレクトリ}buildsrcguiDebugqgis_gui.lib

プリプロセッサはもしかしたら過不足があるかと思います。

コンパイルができたら、実際の機能を実装していきますが、プラグインのテストができるようにするために、
先にプロバイダプラグインを呼び出すGUIプラグインを作成しておいたほうがいいでしょう。

QGIS プロバイダプラグイン その他のページ

アーカイブ