QFileDialog передача каталога в скрипт Python - PullRequest
1 голос
/ 11 апреля 2009

Я пишу небольшую программу на 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

спасибо за любую помощь, которую вы можете оказать.

Mark

1 Ответ

1 голос
/ 11 апреля 2009

Два возможных решения.

Метод 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 на случай, если у кого-то все еще будет эта проблема:

PyQt4 Roadmap

Неявное копирование const &

Реализовано в текущих снимках.

Когда PyQt переносит const & value возвращается функцией C ++ адрес самого значения. Также, это не приводит в исполнение const приписывать. Это может вызвать неожиданное поведение (и программные сбои) либо по исчезающей базовой стоимости или значение неожиданно модифицировано.

Правильный способ справиться с этим явно сделать копию значения используя конструктор копирования своего типа. Однако это не Pythonic и зная, что это нужно сделать требуется знание API C ++.

PyQt будет изменен так, чтобы он автоматически вызывать копию конструктор и обернет копию.

...