我正在编写一个通过XML文件的python程序并对标签进行一些替换。它需要三个参数,一个创建目录树的路径,一个读取的XML文件以及它输出的xml文件。它只是传入参数从命令行工作正常。因为它不仅仅适合我,我认为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
感谢您提供任何帮助。
标记
答案 0 :(得分:1)
两种可能的解决方案。
方法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()函数包装在QDateEdit函数返回的QDate的显式副本。 QDate构造函数。
方法2:
否则,请改用text()方法。返回的QString是一个常量值,而不是常量内存引用。请参阅此文档:
http://doc.trolltech.com/4.4/qlineedit.html#text-prop
displayText : const QString
text : QString
<强>更新强>
看起来Riverbank将在未来版本的PyQt中解决这个问题,以防任何人仍然遇到这个问题:
const&amp;
的隐式复制在当前快照中实施。
当PyQt包装const&amp;值 它包装的C ++函数返回 值本身的地址。也, 它不强制执行const 属性。这可能会导致意外 行为(和程序崩溃)也是 由基础价值消失 或意外的价值 修改。
处理此问题的正确方法是 明确地复制该值 使用其类型的复制构造函数。 然而,这不是Pythonic和 知道它需要完成 需要了解C ++ API。
将更改PyQt以便它 自动调用副本 构造函数并将包装副本。