上一節講到了如何配置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的地址。
- Bug tracker : https://github.com/GeospatialPython/Learn/issues
- Repository : https://github.com/GeospatialPython/Learn/
當然,我們這裏的插件只是個示範,所以,把“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,歡迎大家交流。