0

XMLファイルを調べてタグの置換を行う小さなpythonプログラムを書いています。ディレクトリ ツリーを作成するパス、読み込み先の XML ファイル、出力先の xml ファイルの 3 つの引数を取ります。コマンドラインから引数を渡すだけで問題なく動作します。それは私だけのものではないので、IDがQtの前に置くと思いました。以下は、Qt フロントの大部分です。MOVtoMXF は、すべての置換を行うクラスです。したがって、基本的には、文字列を取得して、既に作成およびテストされているクラスに入力しているだけであることがわかります。

class Form(QDialog):

    def ConnectButtons(self):
        self.connect(self.pathBrowseB, SIGNAL("clicked()"), self.pathFileBrowse)
        self.connect(self.xmlFileBrowseB, SIGNAL("clicked()"), self.xmlFileBrowse)
        self.connect(self.outputFileBrowseB, SIGNAL("clicked()"), self.outputFileBrowse)

    def accept(self):
        path = self.pathBox.displayText()
        xmlFile = self.xmlFileBox.displayText()
        outFileName = self.outfileNameBox.displayText()
        print path + "  " + xmlFile + " " + outFileName
        mov1 = MOVtoMXF.MOVtoMXF(path, xmlFile, outFileName)
        mov1.ScanFile()
        self.done()

    def pathFileBrowse(self):
        file = str(QFileDialog.getExistingDirectory(self, "Select Directory"))
        self.pathBox.setText(file)

    def xmlFileBrowse(self):
        file = str(QFileDialog.getOpenFileName(self, "Save File"))
        self.xmlFileBox.setText(file)

    def outputFileBrowse(self):
        file = str(QFileDialog.getSaveFileName(self, "Save File"))
        self.outfileNameBox.setText(file)

問題は、パスをフィードすると、ディレクトリが存在しないか、末尾にスラッシュがある場合にエラーが返されることです。

ファイル "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/posixpath.py"、62 行目、結合 elif path == '' または path.endswith('/'):

おそらく、QFileDialog、QString、そのパスバック、および私のpythonが期待する文字列の間に不一致があると思います。しかし、それを修正する方法がわかりません。

Max OS X 10.5.6 pyQt 4.4.4 QT 4.4.0で実行しています

あなたが与えることができるどんな助けにも感謝します.

マーク

4

1 に答える 1

1

2 つの潜在的な解決策。

方法 1:

displayText() メソッドを使用する必要がある場合は、displayText() の呼び出しを明示的な文字列キャストでラップすることをお勧めします。

path = str(self.pathBox.displayText()) 
xmlFile = str(self.xmlFileBox.displayText()) 
outFileName = str(self.outfileNameBox.displayText())

その理由は、displayText() が C++ レベルで一定のメモリ参照であると私が信じているものを返すためです。つまり、QString のコピーが返されるのではなく、実際にはメモリ参照で利用可能な QString は何でも返されます。

displayText() 関数を呼び出すと、期待どおりの文字列ですが、メモリ参照の内容が変更されると、最終的に別の文字列になります。さまざまなコントロール、特に QDateEdit/QDateTimeEdit/QTimeEdit コントロールのいくつかのメソッドでこの特異性に気付きました。ここでは通常、QDateEdit の date() 関数によって返される QDate を明示的にコピーする必要があります。 QDate コンストラクター。

方法 2:

それ以外の場合は、代わりに text() メソッドを使用してください。返される QString は、定数メモリ参照ではなく、定数値です。このドキュメントを参照してください:

http://doc.trolltech.com/4.4/qlineedit.html#text-prop

displayText : const QString 
text : QString

アップデート:

誰かがまだこの問題を抱えている場合に備えて、Riverbank は PyQt の将来のバージョンでこの問題に対処するようです:

PyQt4 ロードマップ

const& の暗黙のコピー

現在のスナップショットに実装されています。

PyQt が C++ 関数によって返された const& 値をラップすると、値自体のアドレスがラップされます。また、const 属性を強制しません。これにより、基になる値が消えたり、値が予期せず変更されたりして、予期しない動作 (およびプログラムのクラッシュ) が発生する可能性があります。

これを処理する正しい方法は、その型のコピー コンストラクターを使用して値のコピーを明示的に作成することです。ただし、これは Pythonic ではなく、実行する必要があることを知るには、C++ API の知識が必要です。

PyQt は、自動的にコピー コンストラクターを呼び出してコピーをラップするように変更されます。

于 2009-04-11T01:30:27.393 に答える