QFileDialog передача каталога скрипту 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)
проблема заключается в том, что когда я вводю Путь, он теперь возвращается с ошибкой, либо каталог не существует, либо у меня есть косая черта в конце, которая
Файл "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/posixpath.py", строка 62, в соединении указать путь == " или path.endswith('/'):
Я думаю, что это, вероятно, какое-то несоответствие между QFileDialog, QString, который он передает обратно, и строкой, которую ожидает мой python.но я не уверен, как это исправить.
Я работаю на максимальной OS X 10.5.6 PyQt 4.4.4 QT 4.4.0
спасибо за любую помощь, которую вы можете оказать.
Отметка
Решение
Два потенциальных решения.
Способ 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, где мне обычно приходится создавать явную копию, скажем, QDate, возвращаемого функцией date() QDateEdit, путем упаковки его в конструктор 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 будет изменен таким образом, что он будет автоматически вызывать копию конструктор и обернет копию.