将目录传递给python脚本的QFileDialog

2024-09-27 07:33:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个小python程序,它遍历一个XML文件并替换一些标记。它有三个参数,一个创建目录树的路径,读取的XML文件和输出到的XML文件。它只需在命令行中传递参数就可以正常工作。因为这不仅仅是为了我,我想我在上面加了个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.framework/Versions/2.5/lib/Python2.5/posixpath.py“,第62行,in join elif路径==''或路径.endswith('/'):

我想这可能是QFileDialog、其返回的QString和python所期望的字符串之间的不匹配。但我不知道该怎么修理它。在

我在Max OS X 10.5.6上运行 pyQt 4.4.4 QT 4.4.0版

谢谢你的帮助。在

马克


Tags: 文件pathself路径signaldefconnectxml
1条回答
网友
1楼 · 发布于 2024-09-27 07:33:55

两种可能的解决方案。在

方法1:

如果必须使用displayText()方法,我建议您用显式字符串转换来包装对displayText()的调用:

path = str(self.pathBox.displayText()) 
xmlFile = str(self.xmlFileBox.displayText()) 
outFileName = str(self.outfileNameBox.displayText())
原因是DePaseTeXTo()返回了我认为的C++级别的常量内存引用,这意味着您没有返回qScript的副本,但实际上QString内存中的任何可用的字符串都是可用的。在

当您调用displayText()函数时,它是您期望的字符串,但最终当内存引用的内容发生更改时,它将是另一个字符串。我注意到了不同控件上的几个方法的这种特殊性,最明显的是QDateEdit/QDateTimeEdit/QTimeEdit控件,在这里我通常需要显式地复制QDate,比如说,QDateEdit的date()函数返回的QDate被包装在QDate构造函数中。在

方法2:

否则,请改用text()方法。返回的QString是一个常量值,而不是一个常量内存引用。参见本文件:

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

^{pr2}$

更新:

看起来Riverbank将在PyQt的未来版本中解决此问题,以防有人仍有此问题:

PyQt4 Roadmap

Implicit Copying of const&

Implemented in current snapshots.

When PyQt wraps a const& value returned by a C++ function it wraps the address of the value itself. Also, it does not enforce the const attribute. This can cause unexpected behavour (and program crashes) either by the underlying value disappearing or the value being unexpectedly modified.

The correct way to handle this is to explicitly make a copy of the value using its type's copy constructor. However, that is not Pythonic and knowing that it needs to be done requires knowledge of the C++ API.

PyQt will be changed so that it will automatically invoke the copy constructor and will wrap the copy.

相关问题 更多 >

    热门问题