關於QGis1.8二次開發的環境配置

張明奇-卡哥發表於2020-11-01

這篇文章是基於已經正確編譯並且生成二次開發所需的庫檔案的基礎上的,如果你還沒有得到開發的庫檔案,請參見我的上一篇博文,點選這裡檢視。

OK,要進行二次開發首先就是環境配置。這裡使用的QGis版本為1.8。開啟Visual Studio 2010,新建一個Qt application(如果你沒有這個專案模板說明你沒有正確安裝Qt for vs add-in外掛),這樣做可以避免我們手動去新增Qt的庫檔案目錄。出現如下介面:

注意將 XML library勾上,這個非常重要,不然後面會報錯。因為QgsMapCanvas需要用到QDomNode檔案,而QDomNode是一個XML檔案,包含在Qt的XML library中。

點選Finish之後,生成解決方案。在工程專案上點選右鍵---屬性,出現工程屬性配置對話方塊,在這裡我們需要配置QGis的開發庫路徑,分別包含4個設定步驟,分別是:

1、新增附加包含目錄:

選中C/C++選項卡的“常規”選項,在附加包含目錄當中加入編譯QGis生成的include資料夾路徑,如:

2、新增預處理命令:

選中C/C++選項卡下的“前處理器”命令,新增預處理定義,輸入下圖中的三行預處理命令:

3、新增附加庫目錄

在連結器選項卡下,開啟“常規”,新增附加庫目錄,將QGis開發庫中的lib資料夾新增進來,例如:

4、輸入附加依賴項

選擇連結器選項卡中的“輸入”選項,新增附加依賴項,將下圖所示三行個lib檔名稱新增進來:

OK,大功告成,下面就是寫測試程式碼了。

我將QGis官方文件中的一段程式碼貼過來,大家可以用此來測試自己的環境是否正確搭建。非常簡單,把你的main.cpp檔案中的程式碼替換為下面的程式碼:

 

 
  1. #include<QtGui/QApplication>

  2. #include<qgsapplication.h>

  3. #include<qgsproviderregistry.h>

  4. #include<qgssinglesymbolrenderer.h>

  5. #include<qgsmaplayerregistry.h>

  6. #include<qgsvectorlayer.h>

  7. #include<qgsmapcanvas.h>

  8. #include<QString>

  9. #include<QApplication>

  10. #include<QWidget>

  11.  
  12.  
  13.  
  14. int main( intargc, char *argv[] )

  15. {

  16. QgsApplication a( argc, argv ,true);

  17. //

  18. //注意這三行程式碼需要更改路徑;

  19. QString myPluginsDir ="D:/3rd_Party/qgis1.8vs2008/plugins";//外掛路徑(編譯好的qgis資料夾下的plugins資料夾);

  20. QString myLayerPath ="E:/Jacory/Work/Clip.shp";//圖層路徑,必須設定為你電腦裡面shp檔案的路徑,不然打不開資料;

  21. QStringmyLayerBaseName = "Clip";//圖層名稱;

  22. //

  23. QgsProviderRegistry::instance( myPluginsDir); //初始化外掛的目錄;

  24.  
  25. QgsVectorLayer * mypLayer = newQgsVectorLayer( myLayerPath, myLayerBaseName, "ogr" ); //初始化向量圖層;

  26.  
  27. QgsSingleSymbolRenderer *mypRenderer = newQgsSingleSymbolRenderer( mypLayer->geometryType() );

  28. QList <QgsMapCanvasLayer> myLayerSet;

  29. mypLayer->setRenderer( mypRenderer );

  30.  
  31.  
  32. QgsMapLayerRegistry::instance()->addMapLayer( mypLayer, TRUE );

  33.  
  34. myLayerSet.append( QgsMapCanvasLayer(mypLayer, TRUE ) );

  35.  
  36. QgsMapCanvas * mypMapCanvas = newQgsMapCanvas( 0, 0 );

  37. mypMapCanvas->setExtent(mypLayer->extent() );

  38. mypMapCanvas->enableAntiAliasing( true);

  39. mypMapCanvas->setCanvasColor( QColor(255, 255, 255 ) );

  40. mypMapCanvas->freeze( false );

  41. mypMapCanvas->setLayerSet( myLayerSet);

  42. mypMapCanvas->setVisible( true );

  43. mypMapCanvas->refresh();

  44.  
  45. return a.exec();

  46. }


這裡要注意的是上面標註出來的三行路徑程式碼需要更改。

 

OK,非常簡單,將QGis安裝目錄中的bin資料夾下各種dll檔案拷貝過來就能夠除錯執行了,注意,不是QGis開發包路徑,是QGis Desktop安裝的路徑下面的bin資料夾。當然,你不想安裝QGis也可以將OSGeo4W的bin資料夾下的dll和QGis開發庫目錄的bin資料夾下的dll檔案,以及所有用到的第三方庫的dll檔案都拷貝到VS工程目錄的資料夾下也可以。dll檔案如下圖:

我沒有去研究到底哪些需要,哪些不需要,我採取了最簡單的辦法,把這些dll全部複製過去。。。

最後,除錯執行,出現下圖所示介面,恭喜你,你成功了!Enjoy!

 

 

補充一點:如果你執行時出現“無法找到QDomDocument(或者QDomNode)”的錯誤,說明你的Qt沒有包含XML library,我上面已經講過了。這裡你還是可以在VS選單欄裡面選擇Qt選單---Project Settings進行設定,如下圖:

最後,有用QGis進行二次開發的朋友,我非常希望與大家交流,互相學習,請大家指教!謝謝!

 

2015年12月26日  更新:

上面的測試程式碼從2.0開始已經不能用了,鑑於很多同學反應,將新版本的測試程式碼貼上來,如下:

 

  1. #include<QtGui/QApplication>

  2. #include<qgsapplication.h>

  3. #include<qgsproviderregistry.h>

  4. #include<qgssinglesymbolrendererv2.h>

  5. #include<qgsmaplayerregistry.h>

  6. #include<qgsvectorlayer.h>

  7. #include<qgsmapcanvas.h>

  8. #include<QString>

  9. #include<QApplication>

  10. #include<QWidget>

  11. #include <QStringList>

  12.  
  13.  
  14. #include<QMessageBox>

  15. #include<QObject>

  16. #include <QList>

  17. #include <QFileInfoList>

  18. #include <QDir>

  19. #include <QLibrary>

  20. #include <QDebug>

  21.  
  22.  
  23. int main( int argc, char *argv[] )

  24. {

  25. QgsApplication myApp( argc, argv, true );

  26. QgsApplication::setPrefixPath( "C:/Program Files/qgis2.9.0", true );

  27. QString pluginPath = QgsApplication::pluginPath();

  28. QgsApplication::initQgis();

  29.  
  30. QgsProviderRegistry* provider = QgsProviderRegistry::instance();

  31.  
  32. QString myLayerPath = "D:/Data/qgis_sample_data/shapefiles/airports.shp";

  33. QString myLayerBaseName = "airports"; //圖層名稱;

  34.  
  35. QList<QgsMapLayer*> myList;

  36. QgsVectorLayer* mypLayer = new QgsVectorLayer( myLayerPath, myLayerBaseName, "ogr", false );

  37. if ( !mypLayer )

  38. {

  39. return 0;

  40. }

  41. if ( mypLayer->isValid() )

  42. {

  43. QMessageBox::information( 0, "", "layer is valid" );

  44. mypLayer->setProviderEncoding( "System" );

  45. myList << mypLayer;

  46. }

  47. QgsMapLayerRegistry::instance()->addMapLayer( mypLayer );

  48. QList<QgsMapCanvasLayer> myLayerSet;

  49. myLayerSet.append( QgsMapCanvasLayer( mypLayer ) );

  50.  
  51. QgsMapCanvas* mypMapCanvas = new QgsMapCanvas( 0, 0 );

  52. mypMapCanvas->setExtent( mypLayer->extent() );

  53. mypMapCanvas->enableAntiAliasing( true );

  54. mypMapCanvas->setCanvasColor( QColor( 255, 255, 255 ) );

  55. mypMapCanvas->freeze( false );

  56. mypMapCanvas->setLayerSet( myLayerSet );

  57. mypMapCanvas->setVisible( true );

  58. mypMapCanvas->refresh();

  59.  
  60. return myApp.exec();

  61.  
  62.  
  63. }

相關文章