【问题标题】:QFileDialog passing directory to python scriptQFileDialog 将目录传递给 python 脚本
【发布时间】:2010-10-18 20:46:17
【问题描述】:

我正在编写一个小 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

感谢您提供的任何帮助。

标记

【问题讨论】:

  • 你能把代码贴在脚本里吗?以及确切的错误信息?

标签: python qt parsing pyqt qfile


【解决方案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 Roadmap

const& 的隐式复制

在当前快照中实现。

当 PyQt 包装一个 const& 值时 由它包装的 C++ 函数返回 值本身的地址。还, 它不强制执行 const 属性。这可能会导致意外 行为(和程序崩溃)要么 基础价值消失 或值意外 修改。

处理这个问题的正确方法是 显式复制该值 使用其类型的复制构造函数。 然而,这不是 Pythonic 和 知道它需要完成 需要了解 C++ API。

PyQt 将被更改,以便 自动调用副本 构造函数并将包装副本。

【讨论】:

    猜你喜欢
    • 2014-10-25
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 2017-09-04
    • 2016-09-02
    • 2014-06-06
    • 2021-08-14
    相关资源
    最近更新 更多