Làm cách nào tôi có thể thêm Nút thanh công cụ và Hộp thoại thứ hai vào plugin QGIS được xây dựng với Trình tạo plugin?


8

Tôi muốn tạo một thanh công cụ với 2 nút, mỗi nút mở một hình thức khác nhau.

Các bước tôi làm theo là:

  • Tạo plugin bằng Trình tạo plugin

  • Tạo một thanh công cụ với 2 nút bằng cách thực hiện các sửa đổi cần thiết trong tệp thực hiện.

Cho đến đây, mọi thứ đều hoạt động tốt, vì vậy khi nhấp vào nút đầu tiên, biểu mẫu tương ứng sẽ mở một cách chính xác. Biểu mẫu này là biểu mẫu được tạo bởi trình tạo Plugin.

Sau đó, tôi muốn có một hình thức thứ hai sẽ mở khi nhấp vào nút thứ hai. Vì thế:

  • Tạo một biểu mẫu mới trong trình thiết kế Qt (form2.ui),

  • Đã dịch tệp ui sang tệp py (make) và nhập lớp từ tệp py đã dịch vào tệp thực hiện, có một phiên bản của lớp (self.dlg2 = Ui_form2 ())

và trong phương thức run () của tệp thực hiện tôi đã viết:

def run2(self):
    self.dlg2.show()
    result = self.dlg2.exec_()

Nhưng sau đó tôi nhận được một thông báo lỗi rằng biểu mẫu mới này không có phương thức .show (). Nó có nên kế thừa một cái gì đó để thực hiện phương thức .show () không? Nhưng làm thế nào tôi có thể sửa đổi mã của biểu mẫu thứ hai để kế thừa một cái gì đó vì tất cả các thay đổi trong tệp py được dịch từ tệp ui không thể được lưu?

Câu trả lời:


5

Đây là những gì tôi đã làm để thực hiện nút Thanh công cụ thứ hai và hộp thoại tương ứng của nó:

  1. Chỉnh sửa plugin.pytệp để thêm một run2()phương thức, một self.dlg2biến, một hành động mới initGui()và nhập này:

    from plugin_dialog2 import pluginDialog2
  2. Sao chép và dán tệp UI và đổi tên thành form2.ui(tùy chọn, mở tệp trong Qt-Designer và thay đổi thuộc windowTitletính để phân biệt cả hai hộp thoại một cách trực quan).

  3. Sao chép và dán plugin_dialog.pytệp và đổi tên thànhplugin_dialog2.py

  4. Chỉnh sửa plugin_dialog2.pytệp điều chỉnh tên lớp thành pluginDialog2, tham số đầu tiên của super to abcDialog2và tên của tệp UI:

    import os
    from PyQt4 import QtGui, uic
    
    FORM_CLASS, _ = uic.loadUiType(os.path.join(
        os.path.dirname(__file__), 'form2.ui'))
    
    class abcDialog2(QtGui.QDialog, FORM_CLASS):
        def __init__(self, parent=None):
            """Constructor."""
            super(abcDialog2, self).__init__(parent)
            self.setupUi(self)

Bạn có thể tải xuống một plugin demo với hai hộp thoại từ đây .


Cảm ơn rât nhiều!!! Điều này đang hoạt động tốt và đồng thời nó đã hiểu rõ hơn về việc xây dựng plugin .. Vì vậy, tôi cho rằng quy trình trên có thể được áp dụng nhiều lần hơn, ví dụ như tôi muốn có 3 hoặc 4 nút, mỗi nút mở một hình thức khác nhau. Nhưng nút thứ 3 của tôi không xuất hiện trên thanh công cụ. Bất cứ ý tưởng tại sao điều này đang xảy ra?
Eleftheria

2
Đúng vậy, nó sẽ hoạt động nhiều lần bạn cần, miễn là bạn giữ một thứ tự đặt tên biến, lớp và tương tự. Chẳng hạn, để thêm nút thứ 3 của bạn, bạn sẽ cần thêm một hành động mới initGui(), theo cách này: self.add_action( icon_path, text=self.tr(u'plugin3'), callback=self.run3, parent=self.iface.mainWindow())
Germán Carrillo

Chà, cuối cùng thì nó cũng hoạt động tốt sau khi tôi khởi động lại máy tính của mình ...
Eleftheria

8

1 . Sử dụng Plugin builder để tạo ra một plugin mới

Các tập tin được tạo được hiển thị trong hình dưới đây

nhập mô tả hình ảnh ở đây

2 . Chuyển đổi tệp tài nguyên ( resource.qrc ) thành tệp Python ( resource.py ) bằng Shell OSGeo4W

pyrcc4 -o resources_rc.py resources.qrc

Sau đó, nếu bạn nhìn vào bên trong thư mục plugin , bạn sẽ thấy một tệp .py mới , tệp resource.txt vừa được tạo. Hiện tại, plugin có thể được cài đặt và mở thông qua menu chính của QGIS> Quản lý và cài đặt Plugin.

3 . CÁCH TẠO CÁC CÔNG CỤ VÀ CÁC CÔNG CỤ (các nút) VÀ THÊM CÁC CÔNG CỤ TRÊN CÔNG CỤ

Mở bằng trình chỉnh sửa tệp my_toolbar.py và trong phần của initGui (tự) viết:

def initGui(self):

    self.toolBar = self.iface.addToolBar("MY TOOLBAR tools")
    self.toolBar.setObjectName("MY TOOLBAR tools")

    self.act1 = QAction(QIcon(":/plugins/Myplugintoolbar/icon.png"), QCoreApplication.translate("IMPRESStoolbar", "Tool1"), self.iface.mainWindow())
    self.act2 = QAction(QIcon(":/plugins/Myplugintoolbar/icon.png"), QCoreApplication.translate("IMPRESStoolbar", "Tool2"), self.iface.mainWindow())
    self.act3 = QAction(QIcon(":/plugins/Myplugintoolbar/icon.png"), QCoreApplication.translate("IMPRESStoolbar", "Tool3"), self.iface.mainWindow())

Bằng cách này, ba nút / công cụ đã được tạo.

Để các nút xuất hiện trên thanh công cụ, hãy tiếp tục viết như sau:

    self.toolBar.addAction(self.act1)
    self.toolBar.addAction(self.act2)
    self.toolBar.addAction(self.act3)

Để các nút khi nhấp để mở gui, hãy tiếp tục viết như sau:

    QObject.connect(self.act1, SIGNAL("triggered()"), self.runtool1)
    QObject.connect(self.act2, SIGNAL("triggered()"), self.runtool2)
    QObject.connect(self.act3, SIGNAL("triggered()"), self.runtool3)

Các phương thức runtool1 , runtool2runtool3 được định nghĩa sau như sau để mở một gui khác nhau cho mỗi nút

def runtool1(self):
     self.dlgtool1.show()

def runtool2(self):
     self.dlgtool2.show()

def runtool3(self):
     self.dlgtool3.show()

Bằng cách đó khi nút tool1 được nhấp gui dlgtool1 sẽ mở ra, khi nút tool2 được nhấp các dlgtool2 sẽ mở ra và khi nút tool3 được nhấp các dlgtool3 gui sẽ mở ra.

dlgtool1 , dlgtool2dlgtool3 nên là các biến chỉ vào các tệp ui đại diện cho các hộp thoại .

Vì vậy, các hộp thoại phải là:

  • tạo ,

  • được nhập vào tệp py chính ( my_toolbar.py ) và

  • được gán cho các biến ( dlgtool1 , dlgtool2dlgtool3 ) để lấy một thể hiện của chúng.

Để tạo các hộp thoại :

  • Sao chép các tập tin my_toolbar_dialog.pymy_toolbar_dialog_base.ui và dán chúng vào một thư mục khác để bạn có thể đổi tên chúng. Làm điều này nhiều lần nếu cần, cho ví dụ này ba lần. Sau đó sao chép các tệp mới này và dán chúng trở lại thư mục Myplugintoolbar nhập mô tả hình ảnh ở đây

Mở Form_dlgtool1_dialog.py bằng trình chỉnh sửa để áp dụng các sửa đổi sau:

Từ :

import os
from PyQt4 import QtGui, uic

FORM_CLASS, _ = uic.loadUiType(os.path.join(
    os.path.dirname(__file__), 'my_toolbar_dialog_base.ui'))

class MyplugintoolbarDialog(QtGui.QDialog, FORM_CLASS):
    def __init__(self, parent=None):
        super(MyplugintoolbarDialog, self).__init__(parent)
        self.setupUi(self)

Thay đổi thành :

import os
from PyQt4 import QtGui, uic

FORM_CLASS, _ = uic.loadUiType(os.path.join(
    os.path.dirname(__file__), 'Form_dlgtool1.ui'))

class Formdlgtool1Dialog(QtGui.QDialog, FORM_CLASS):
    def __init__(self, parent=None):
        super(Formdlgtool1Dialog, self).__init__(parent)
        self.setupUi(self)

Thực hiện theo quy trình tương tự cho hai tệp khác ( Form_dlgtool2_dialog.pyForm_dlgtool3_dialog.py )

Sau đó, để nhập các hộp thoại vào tệp chính, hãy mở tệp my_toolbar.py bằng trình chỉnh sửa và nhập thông tin sau

from Form_dlgtool1_dialog import Formdlgtool1Dialog

from Form_dlgtool2_dialog import Formdlgtool2Dialog

from Form_dlgtool3_dialog import Formdlgtool3Dialog

Cuối cùng, để có được một thể hiện của chúng , hãy viết phần bên trong phần def __init __ (self, iface) :

self.dlgtool1 = Formdlgtool1Dialog()
self.dlgtool2 = Formdlgtool2Dialog()
self.dlgtool3 = Formdlgtool3Dialog()

Bây giờ, bạn có thể mở các tệp ui trong QtDesigner và tùy chỉnh chúng. Sau đó tải lại thanh công cụ plugin bên trong QGIS để nhận kết quả sau

nhập mô tả hình ảnh ở đây

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.