Mục đích của một số chức năng và tệp trong các plugin Python của QGIS là gì?


8

Tôi chỉ đang cố gắng tìm hiểu kiến ​​trúc của Plugin QGIS được tạo bằng Trình tạo plugin QGIS, cũng như quy trình làm việc và liên kết giữa các tệp được tạo. Nếu có thể, tôi thích một sơ đồ hơn.

Cũng rất hữu ích khi biết các hàm sau làm gì trong mã Python. Tôi mới trong việc tạo Plugin QGIS.

  1. __init__( self, iface )
  2. tr( self, message )
  3. add_action( self )
  4. initGui( self )
  5. unload( self )
  6. run( self )

một số thông tin trong liên kết sau: docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/ . Thật không may, tôi không nghĩ rằng có 'Hướng dẫn giả' trong việc phát triển các plugin QGIS (như tôi chắc chắn có thể làm với một!).
Giuse

Rất tiếc phải nói rằng url trên không được tìm thấy trên máy chủ.
Người dùng123

Đây là một câu hỏi Python thuần túy về việc tạo các lớp (chung và với PyQt4 ). Câu hỏi duy nhất của PyQGIS ở đây là iface(giao diện QGIS) là gì . Dường như với tôi rằng nếu bạn biết Python, các tập lệnh sẽ tự giải thích (với tất cả các mô tả #)
gen

Fine. Tôi chỉ tự hỏi làm thế nào mỗi chức năng sẽ phản ánh qgis. Nói ví dụ chạy thay đổi mã chức năng sẽ phản ánh trong plugin của chúng tôi.
Người dùng123

Thật kỳ lạ, url đã hoạt động trước khi ... thử cái này: docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/ Kẻ
Joseph

Câu trả lời:


16

Các PyQGIS Cookbook giải thích những tập tin được phổ biến trong các plugin QGIS. Như bạn có thể thấy ở đó, bạn sẽ chỉ cần ba tệp để chạy một plugin tối thiểu:

  • __init__.py
  • metadata.txt
  • mainPlugin.py

Các __init__.pytập tin cho phép QGIS biết Plugin thư mục là một mô-đun Python. Nó phải chứa một classFactory(iface)hàm mà QGIS sử dụng để khởi tạo plugin của bạn, sử dụng lớp Plugin chính của bạn, có trong mainPlugin.pytệp.

metadata.txt là nơi bạn chỉ định siêu dữ liệu của plugin, nghĩa là tên của tác giả, tác giả, giấy phép, phiên bản, trang chủ, bugtracker, kho lưu trữ, trong số những thứ khác.

mainPlugin.pycó thể được đặt tên theo những cách khác. Đây là tệp được tham chiếu trong __init__.pyvà chứa các hàm bạn liệt kê trong câu hỏi của bạn. Tôi muốn nói rằng tập tin này là cốt lõi của plugin của bạn.


Về Trình tạo plugin QGIS, tôi khuyên bạn nên đọc tài liệu chính thức để có ý tưởng về cách cấu trúc. Tôi thực sự không thích sử dụng plugin như vậy, bởi vì nó tạo ra nhiều thứ bạn không muốn biết trong khi bạn đang học những điều cơ bản về phát triển plugin.

Tôi khuyên bạn nên bắt đầu từ các plugin bạn hoàn toàn hiểu. Đó là, bắt đầu với một cấu trúc plugin rất cơ bản (thậm chí là tối thiểu) và chỉ thêm độ phức tạp khi cần thiết và khi bạn nắm vững các kiến ​​thức cơ bản.

Mặt khác, tôi sẽ cho bạn biết các chức năng bạn liệt kê là gì:

  1. __init__( self, iface )

    Đây là hàm tạo của plugin của bạn. Khi QGIS nhận ra một thư mục là một plugin Python, __init__()phương thức được thực thi và đối tượng giao diện iface, được chuyển đến plugin của bạn để nó có thể truy cập vào QGIS sau đó.

    Bạn nên sử dụng phương pháp này để lưu tham chiếu đến iface(vì đây sẽ là điểm nhập cảnh của bạn đến các thành phần QGIS) cũng như để khởi tạo các biến khác mà bạn sẽ sử dụng trong các chức năng khác của plugin.

  2. tr( self, message )

    Đây là một hàm Python để lấy các bản dịch từ các chuỗi. Tất nhiên bạn sẽ cần cung cấp bản dịch, nhưng bạn làm điều đó trong các tệp Qt khác (cụ thể là trong tệp .ts).

    Nói chung, bạn sẽ không cần chức năng này trừ khi bạn sẽ hỗ trợ các ngôn ngữ khác ngoài tiếng Anh. Nó chắc chắn không phải là ưu tiên cho các nhà phát triển PyQGIS mới.

  3. add_action( self )

    Đây là chức năng tôi chỉ thấy trong các plugin được tạo thông qua Trình tạo plugin QGIS. Nó giúp bạn thiết lập GUI plugin của bạn. Cá nhân tôi không sử dụng nó trong các plugin của mình.

  4. initGui( self )

    Đây là một phương pháp để thiết lập GUI của Plugin trong QGIS. Tại đây, bạn chỉ định xem bạn có muốn có một nút trong thanh công cụ của Plugin QGIS, thanh công cụ tùy chỉnh, một nút bên trong menu QGIS hiện có và / hoặc (không được khuyến nghị) một menu tùy chỉnh mới.

    Đây cũng là một nơi tốt để thiết lập các kết nối TÍN HIỆU / SLOT chia sẻ các nút plugin (hoặc các điều khiển khác) và các chức năng của bạn.

  5. unload( self )

    Đây là một phương pháp để loại bỏ các widget plugin (nút, menu và những thứ tương tự) của bạn khỏi GUI GUI.

    Đây cũng là một nơi tốt để ngắt kết nối TÍN HIỆU và SLOTS mà bạn đã kết nối initGui( self ).

  6. run( self )

    Đây là phương pháp chính của plugin của bạn. Tại đây, bạn đặt mã sẽ chạy khi người dùng nhấp vào nút của plugin. Nhìn chung, bạn bắt đầu bằng cách lấy một số dữ liệu từ dự án QGIS hiện tại và sau đó thực hiện một số chỉnh sửa, xử lý hoặc báo cáo. Điều đó hoàn toàn phụ thuộc vào bạn.

    Nếu plugin của bạn có hộp thoại, đây là phương pháp bạn nên mở nó, để người dùng có thể bắt đầu tương tác với hộp thoại. Logic hộp thoại thường được xử lý trong các tệp Python khác, để phân phối mã của bạn và ưu tiên bảo trì và đóng gói.

    Lưu ý rằng đó run()không phải là nơi tốt để đặt kết nối TÍN HIỆU / SLOT, vì làm như vậy, chúng sẽ được đặt mỗi khi bạn mở hộp thoại của plugin, kích hoạt các chức năng (SLOT) của bạn nhiều lần như trong hành vi lẻ trong plugin QGIS: chức năng của tôi là kích hoạt hai lần .


Cuối cùng, cách tốt nhất để học lập trình các plugin QGIS là đọc mã nguồn của các plugin khác. Bắt đầu với những cái đơn giản và khi bạn thành thạo chúng, hãy tiếp tục với những cái phức tạp hơn.

Tôi đã tạo một plugin demo (rất đơn giản) để giúp bạn hiểu cách các plugin QGIS hoạt động. Bạn có thể truy cập nó từ đây . Có hướng dẫn cài đặt trong tệp README. Plugin cho bạn biết, thông qua các hộp thông báo, khi mỗi chức năng bạn yêu cầu được thực thi.


1
Cảm ơn bạn gcarrillo vì lời giải thích rõ ràng của bạn. Tôi chắc chắn rằng nó sẽ cực kỳ hữu ích cho tôi khi mới bắt đầu.
Người dùng123

1
Câu hỏi về phương pháp chạy . Tôi cũng đã thấy nó có tên là onRun . Tôi có thể cho rằng việc đặt tên không thành vấn đề, nhưng nó thường chứa từ hết thói quen?
BritishSteel

2
Đúng @BritishSteel, bạn có thể đặt tên phương thức như bạn muốn. run()là một loại quy ước. Thông thường trong initGui()bạn đặt kết nối giữa một lần nhấp vào nút plugin và run()phương thức của bạn , vì vậy nếu bạn muốn đặt tên khác, bạn cũng nên cập nhật vị trí được sử dụng trong kết nối này. Một cái gì đó như self.action.triggered.connect(self.myCustomRun).
Germán Carrillo

1
Điều này thật tuyệt, tôi cũng sẽ thấy điều này vô cùng hữu ích!
Joseph

@gcarrillo: trong điểm thứ 3, bạn đã đề cập "Đây là chức năng, được thấy trong các plugin được tạo thông qua trình tạo plugin". Tôi chỉ tò mò những cách khác để phát triển các plugin khác ngoài trình tạo plugin.
User123 4/2/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.