PyQGIS開發 -- 創建第一個插件

上一節講到了如何配置PyQGIS開發環境,以及使用Eclipse+PyDev工具進行QGIS開發調試。
前面該說的都已經說了,以後就不廢話,直接進入正題了。

摘要

本文將會詳細闡述如何使用Python創建QGIS插件。

創建插件

最簡單的插件開發工程構建方法,無非是使用Plugin Builder這個插件了。

首先,打開QGIS軟件,在菜單欄選擇“Plugins -> Manage and Install Plugins”,搜索並添加“Plugin Builder”這個插件。

這裏寫圖片描述

安裝成功後,打開”Plugin Builder”插件的對話框,填寫相應的項目信息,如下圖。

這裏寫圖片描述

這裏,我將插件命名爲“MyPlugin”,當然,你也可以取任何名字,只要填上就行。然後點擊“Next”按鈕。

接下來彈出的是“About”窗口,你可以填寫一些信息。然後繼續“Next”。

這裏寫圖片描述

之後,在出現的窗口中,需要選擇插件的類型,以及填寫插件在QGIS軟件菜單欄顯示的名稱。類型我選擇了默認的“Tool button with dialog”也就是帶按鈕的窗口。名稱我這裏依然填寫“MyPlugin”。繼續點擊“Next”。

這裏寫圖片描述

接下來彈出的窗口表示插件工程需要生成的模板,保持默認就可以了,繼續“Next”。

這裏寫圖片描述

到這裏之後,就是填寫“Bug tracker”以及“Repository”等信息,這些信息會直接關聯到QGIS的插件管理平臺。也就說,你的插件發佈以後,就會被所有使用QGIS的“Mange and Install Plugins”工具的人看到,並且可以下載使用。“Bug tracker”和“Repository”可以填寫以下Github的地址。

當然,我們這裏的插件只是個示範,所以,把“Flag the plugin as experimental”打上勾。

這裏寫圖片描述

再次點擊“Next”以後,會彈出插件保存的位置對話框。爲了跟其他QGIS插件保持一致,筆者推薦使用QGIS插件的標準位置,也就是:

C:\Users\<你的用戶名>\.qgis2\python\plugins

當然,不使用這個位置也可以,但是就需要使用“QGIS_PLUGINPATH”這個環境變量來指定你的插件位置,否則QGIS軟件無法加載該插件。配置方法可以是寫入QGIS啓動之前的“startup.py”文件裏面,也可以在QGIS軟件中使用“Settings -> Options -> System -> Environment”進行配置。具體方法在這裏就不展開了。

最後,點擊“OK”按鈕,我們的插件工程就創建好了。

這裏寫圖片描述

編譯插件工程

使用“Plugin Builder”生成的插件工程是直接可用編譯生成的。接下來,我們需要使用到“pyrcc4”這個工具來進行工程編譯。

“pyrcc4”這個是一個命令行工具,有兩種方式可以找到他。第一種方式是直接使用Windows下的命令行工具,如果輸入“pyrcc4”,彈出如下圖所示的信息,則表示這個工具是可用的。

這裏寫圖片描述

有些朋友直接使用命令行是不能找到這個工具的,可以通過配置系統PATH環境變量來找到它。或者採用第二種方式,找到QGIS安裝目錄下的“OSGeo4W.bat”,雙擊打開它,會彈出一個命令行窗口,同樣,在裏面輸入“pyrcc4”測試是否可用。

這裏寫圖片描述
這裏寫圖片描述

在命令行窗口中,我們使用“cd”命令,將當前路徑設置到我們的插件工程路徑下,具體指令爲:

cd C:\Users\<你的用戶名>\.qgis2\python\plugins

然後使用如下命令編譯這個插件的資源。

pyrcc4 -o resources.py resources.qrc

到這裏,MyPlugin這個插件就可以在QGIS軟件中打開了,只需要重啓一下QGIS即可使用它了。

這裏寫圖片描述

插件UI設計

成功創建並運行了我們的第一個QGIS插件之後,我們再來看看這個插件的UI的設計部分。

在我們新建的這個插件目錄下,有一個叫“MyPlugin_dialog_base.ui”的文件,這是一個Qt的UI文件。

這裏寫圖片描述

如果你裝了Qt Designer,你可以直接雙擊這個文件,就會彈出Qt的UI設計師窗口,使用拖拽的方式設計UI。

這裏寫圖片描述

如果沒有裝Qt Designer也沒關係,可以使用記事本或者任何文本編輯器打開這個“MyPlugin_dialog_base.ui”文件,這裏我使用Atom編輯器,如下圖。可以看到,本質上,這是一個XML文件。

這裏寫圖片描述

爲了保持簡單,我使用Qt Designer工具,拖拽了一個Label控件到UI窗口中,並寫上了一句文字。

這裏寫圖片描述

如果你使用的是文本編輯器打開的這個UI文件,那麼複製下面的代碼,替換你的UI文件中的代碼,會得到相同的效果。

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MyPluginDialogBase</class>
 <widget class="QDialog" name="MyPluginDialogBase">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>390</width>
    <height>282</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MyPlugin</string>
  </property>
  <widget class="QDialogButtonBox" name="button_box">
   <property name="geometry">
    <rect>
     <x>30</x>
     <y>240</y>
     <width>341</width>
     <height>32</height>
    </rect>
   </property>
   <property name="orientation">
    <enum>Qt::Horizontal</enum>
   </property>
   <property name="standardButtons">
    <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
   </property>
  </widget>
  <widget class="QLabel" name="label">
   <property name="geometry">
    <rect>
     <x>100</x>
     <y>70</y>
     <width>191</width>
     <height>41</height>
    </rect>
   </property>
   <property name="text">
    <string>This is your first QGIS plugin</string>
   </property>
  </widget>
 </widget>
 <resources/>
 <connections>
  <connection>
   <sender>button_box</sender>
   <signal>accepted()</signal>
   <receiver>MyPluginDialogBase</receiver>
   <slot>accept()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>20</x>
     <y>20</y>
    </hint>
    <hint type="destinationlabel">
     <x>20</x>
     <y>20</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>button_box</sender>
   <signal>rejected()</signal>
   <receiver>MyPluginDialogBase</receiver>
   <slot>reject()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>20</x>
     <y>20</y>
    </hint>
    <hint type="destinationlabel">
     <x>20</x>
     <y>20</y>
    </hint>
   </hints>
  </connection>
 </connections>
</ui>

保存編輯的UI文件之後,我們需要使用“pyuic4”命令編譯它,在剛纔的命令行窗口中輸入一下命令,並敲回車確認:

pyuic4 -o ui_MyPlugin.py MyPlugin_dialog_base.ui

注意,這個命令中”ui_MyPlugin.py”是輸出文件,如果你的插件叫別的名字,例如“testPlugin”,那麼這裏你就應該填寫“ui_testPlugin.py”,加上“ui_”前綴。

如果沒有提示錯誤的話,就是編譯成功了。這時,可以使用上一節“PyQGIS – 環境搭建”中的“Plugin Reloader”工具來重載一下插件(這個工具同樣從”Manage and Install Plugins”窗口中下載)。

這裏寫圖片描述

或者你沒有這個工具的話,重啓一下QGIS效果也是一樣的。再次點擊“MyPlugin”插件,會看到UI已經變成我們剛纔設計的樣子了。

這裏寫圖片描述

可能遇到的問題

1、如果你的插件沒有出現在“Plugins”菜單欄下,一方面要檢查一下插件的位置是否在QGIS默認插件路徑下,也就是:C:\Users\<你的用戶名>.qgis2\python\plugins。另一方面,如果確認一下是否設置了插件位置到“QGIS_PLUGINPATH”變量中。如果確認無誤,但還是無法找到插件,那麼可以打開“Mange and Install Plugins”窗口,搜索自己的插件名稱,如果出現如下圖所示,那麼就是插件配置過程中出現了錯誤。那就返回去重新檢查下上文所述的步驟是否哪裏做錯了。

這裏寫圖片描述

2、要特別注意“pyrcc4”和“pyuic4”這兩個工具中 “-o”選項後面跟的第一個參數是輸出文件名稱,第二個參數纔是輸入文件名稱。並且最後生成的UI文件,一定加上“ui_”前綴,否則QGIS無法正確加載插件。

OK,本節的內容就是這樣,謝謝閱讀。


如有錯誤,請批評指正!

QGIS二次開發羣:68016799,歡迎大家交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章