0

シェープファイルの各ポリゴンのデータ入力をカスタマイズするには、QGIS でフォ​​ームを作成する必要があります。QtDesigner を使用してフォーム (.ui) を作成し、いくつかのテキスト ボックスとコンボ ボックスがシェープファイルのフィールドを指しています。
次に、Nathan QGIS ブログの python ファイルを使用してロジックを追加します。

Python コード:

from PyQt4.QtCore import *
from PyQt4.QtGui import *

nameField = None
myDialog = None

def formOpen(dialog,layerid,featureid):
    global myDialog
    myDialog = dialog
    global nameField
    nameField = dialog.findChild(QTextEdit,"PART")
    buttonBox = dialog.findChild(QDialogButtonBox,"buttonBox")

    nameField.textChanged.connect(Name_onTextChanged)

    # Disconnect the signal that QGIS has wired up for the dialog to the button box.
    buttonBox.accepted.disconnect(myDialog.accept)

    # Wire up our own signals.
    buttonBox.accepted.connect(validate)
    buttonBox.rejected.connect(myDialog.reject)

def validate():
    # Make sure that the name field isn't empty.
    if not nameField.text().length() > 0:
        nameField.setStyleSheet("background-color: rgba(255, 107, 107, 150);")
        msgBox = QMessageBox()
        msgBox.setText("Field PART must not be NULL.")
        msgBox.exec_()
    else:
        # Return the form as accpeted to QGIS.
        myDialog.accept()

def Name_onTextChanged(text):
    if not nameField.text().length() > 0:
        nameField.setStyleSheet("background-color: rgba(255, 107, 107, 150);")
    else:
        nameField.setStyleSheet("")

QGIS で編集セッションを開き、識別ツールでポリゴンをクリックしますが、カスタマイズしたフォームの [OK] ボタンをクリックすると、フィールド PART が NULL であるかどうかに関係なく、次のエラーが発生します。

ERROR CODE LINE >>>> if not nameField.text().length() > 0:
ERROR MESSAGE   >>>> AttributeError: 'str' object has no attribute 'text'

QGIS 1.7.4、Python 2.7.2、Windows 7 64 ビットを実行しています。
私は何かが恋しい...お願い、誰か私を助けることができますか?

4

1 に答える 1

0

QGISの問題よりもPythonエラーがあるようです。

if not nameField.text().length() > 0 の 2 つのインスタンスがあります。

def validate():
    if not nameField.text().length() > 0:

def Name_onTextChanged(text):
    if not nameField.text().length() > 0:

最初は、nameField がこれらの関数のいずれの入力でもないように見えます。したがって、これらは別の場所に割り当てられており、コード例を減らしたと思います。また、「Name_onTextChanged」の変数入力としてテキストがありますが、それを関数「nameField.text().length()」として使用しようとしています。これは問題になる可能性があります。

通常、Python は変数 nameField に対して操作 'text()' を実行できないため、不平を言っていますが、これは文字列であると信じています。文字列に使用できる text() 関数はありません。nameField は実際には QTextEdit オブジェクトであると想定されているようです。

nameField が QTextEdit オブジェクトの場合、代わりに toPlainText() を使用できます。これは、必要なことを行う必要があります。だから何か

if not nameField.toPlainText().strip().length() > 0:

この例では、テキスト フィールドに空白がある場合に肯定的な結果が得られないように、.strip() も含めています。

それはまったく役に立ちますか?

于 2012-12-09T12:48:19.893 に答える