GUIプラグインは選択したファイルのファイル名をプロバイダプラグインに渡して役目を終えます。
プロバイダプラグインは渡されたファイル名やデータベース情報などを元に、それらからデータを読み出してQGISに要素を返します。
ここでは、GUIプラグインからプロバイダプラグインを呼び出す部分を実装します。
GUIクラスにシグナルを追加
まず、QgsCompassSurveyPluginGui.hに以下のシグナルを定義します。
signals:
void drawVectorLayer( QString, QString, QString );
続いて、QgsCompassSurveyPluginGui::on_buttonBox_accepted()
の中身を以下のように実装します。
if ( editFName->text().length() < 0 ) { QString uri = editFName->text(); emit drawVectorLayer( uri, editFName->text(), "compass_survey_data" ); accept(); } else { QMessageBox::warning( this, tr( "No layer name" ), tr( "Please enter a layer name before adding the layer to the map" ) ); }
上記のコードは、OKボタンが押されたときに、ファイル名を引数としてdrawVectorLayer
シグナルを発行するようにしたものです。
シグナルの3つ目の引数に、プロバイダプラグインで定義したプロバイダキーを指定します。
プラグインクラスにプロバイダプラグイン呼び出し部分を追加
QgsCompassSurveyPlugin
クラスでは、シグナルを受け取ってプロバイダプラグインに渡すようにします。
まず、以下のようにスロットを定義します。
private slots: void drawVectorLayer( QString, QString, QString );
スロットは以下のように実装します。
void QgsCompassSurveyPlugin::drawVectorLayer( QString thePathNameQString, QString theBaseNameQString, QString theProviderQString ) { qGisInterface->addVectorLayer( thePathNameQString, theBaseNameQString, theProviderQString ); }
addVectorLayer()
関数の第3引数にはプロバイダプラグインのキーが入っているので、
これによってQGISは呼び出すプロバイダを特定することが出来るようになります。
第1引数はファイルへのパスで、第2引数はQGISに表示するときのレイヤー名となります。
また、シグナルとスロットを接続する以下のコードを、QgsCompassSurveyPlugin::run()
に追加します。
connect( pdlg, SIGNAL( drawVectorLayer( QString, QString, QString ) ),
this, SLOT( drawVectorLayer( QString, QString, QString ) ) );
動作確認
ここまでできたら、プロバイダプラグインのコンストラクタにブレークポイントを入れて、
プロバイダプラグインが呼び出されるかどうかテストしてみましょう。
プロバイダプラグインのコンストラクタで止まったところ
ここから先はプロバイダプラグインの担当になります。
なので、ここまでできたら、あとはプロバイダプラグインの中身を実装するだけです。