Вопрос

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

Дорожная карта PyQt4

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top