0

我已经使用 Qt Creator 扩展了 Plugin builder 生成的 UI 文件。刚刚在表单中添加了一些复选框和一个名为 layercombo 的组合框。该应用程序名为 jacktest.py。它使用中间文件 jackdialog.py(从插件生成器生成,保持不变)。

编译了 UI 文件和资源文件。然后在插件中添加了一些代码并进行了测试。在 QMessagebox 中获取可用的层名称是没有问题的。但是如何将这些添加到组合框中?应该很简单,但没有选项成功引用组合框。

错误消息:AttributeError:jacktest 实例没有属性“layercombo”。

我最近尝试的结果:

# run method that performs all the real work
def run(self):

    # create and show the dialog
    dlg = jacktestDialog()
    # show the dialog
    dlg.show()
    result = dlg.exec_()
    for layer in self.iface.legendInterface().layers():
        if layer.type() == QgsMapLayer.VectorLayer:
           QMessageBox.information( self.iface.mainWindow(), "Info", layer.name())
           self.layercombo.Items.Insert(0, layer.name())
    # See if OK was pressed
    if result == 1:
        # do something useful (delete the line containing pass and
        # substitute with your code
        pass
4

2 回答 2

0

当您设置 layercombo 项目时,您正在尝试引用当前类(这不是您的对话框)

代替:

self.layercombo.Items.Insert(0, layer.name())

dlg.ui.layercombo.Items.Insert(0, layer.name())

但是您的代码仍然无法正常工作,因为exec_()阻塞并等待它返回,因此您将项目添加到不可见的对话框中。

试试这个:

# create and show the dialog
dlg = jacktestDialog()
# show the dialog
for layer in self.iface.legendInterface().layers():
    if layer.type() == QgsMapLayer.VectorLayer:
       QMessageBox.information( self.iface.mainWindow(), "Info", layer.name())
       dlg.ui.layercombo.Items.Insert(0, layer.name())
result = dlg.exec_()
于 2012-05-22T13:05:06.143 回答
0

继续在 run 模块中开发 Signal(代码:def run (self):)

QObject.connect(dlg.ui.layercombo,SIGNAL('currentIndexChanged (int)'),self.select_one)

select_one 的代码是:

def select_one(self):
    comboindex = dlg.ui.layercombo.currentIndex()
    QMessageBox.information(self.iface.mainWindow(), "Info", comboindex)

错误信息:

comboindex = dlg.ui.layercombo.currentIndex() NameError: global name 'dlg' is not defined

假设我必须在函数调用中引用 dlg 作为参数,但这直到现在才起作用。

于 2012-05-28T21:45:12.337 回答