0

我正在编写一个小 python 程序,它通过一个 XML 文件并替换一些标签。它接受三个参数,一个创建目录树的路径,读取的 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 上运行

谢谢你提供的所有帮助。

标记

4

1 回答 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() 函数返回的 QDate 包装在QDate 构造函数。

方法二:

否则,请改用 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 回答