QFileDialogがPythonスクリプトにディレクトリを渡す
質問
XML ファイルを調べてタグの置換を行う小さな Python プログラムを作成しています。これは、ディレクトリ ツリーの作成元のパス、読み込み先の XML ファイル、および出力先の XML ファイルの 3 つの引数を取ります。コマンドラインからは引数を渡すだけで正常に動作します。これは私だけのものではないので、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)
問題は、パスを入力すると、ディレクトリが存在しないか、末尾にスラッシュがある場合にエラーが返されることです。
ファイル "/システム/ライブラリ/フレームワーク/Python.フレームワーク/バージョン/2.5/lib/python2.5/posixpath.py.py"、62行目、結合中 elif path == '' または path.endswith('/'):
おそらく、QFileDialog、それが返されるQString、および私のPythonが期待する文字列の間に何らかの不一致があると思います。しかし、それを修正する方法がわかりません。
Max OS X 10.5.6で実行しています pyQt 4.4.4 QTの4.4.0
助けていただければ幸いです。
マーク
解決
考えられる解決策は 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 の将来のバージョンでこの問題に対処する予定のようです。
const& の暗黙的なコピー
現在のスナップショットに実装されています。
PyQt が const& 値をラップするとき ラップする C++ 関数によって返される 値自体のアドレス。また const は適用されません 属性。これにより、予期しない 動作(およびプログラムのクラッシュ)のいずれか 原資産が消えることによって または、値が予期せず 変更。
これを処理する正しい方法は、 値のコピーを明示的に作成する その型のコピー コンストラクタを使用します。しかし、それはPythonicではなく、 やらなければいけないことを知っている C++ API の知識が必要です。
PyQtは次のように変更されます。 コピーを自動的に呼び出す コンストラクタを呼び出し、コピーをラップします。