QFileDialog diretório passando para script python
Pergunta
Estou escrevendo um pequeno programa python que passa por um arquivo XML e faz alguma substituição de tags. Recebe três argumentos, um caminho de whcih ele cria uma árvore de diretório, o arquivo XML a sua leitura e o arquivo xml sua saída para. Ele funciona muito bem na linha de comando só de passagem em argumentos. Como o próprio não só para mim, eu pensei id colocar uma frente Qt nele. Abaixo está a maioria da frente Qt. MOVtoMXF é a classe que faz todo o substituto. Assim você pode ver que eu estou basicamente apenas agarrando cordas e alimentá-los para a classe que ive já feitas e testadas.
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)
o probelm é que quando eu alimentar em um Path, que agora volta com um erro, quer a exist diretório não faz, ou se eu tenho uma barra na extremidade que
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/posixpath.py", linha 62, em juntar-se caminho elif == '' ou path.endswith ( '/'):
Eu acho que é provavelmente alguma incompatibilidade entre o QFileDialog, o QString sua volta passagem ea cadeia os meus espera python. mas im não sei como proceder para corrigi-lo.
Im em execução no Max OS X 10.5.6 PyQt 4.4.4 QT 4.4.0
Obrigado por qualquer ajuda que você pode dar.
Mark
Solução
soluções Dois potenciais.
Método 1:
Se você deve usar o método displayText (), eu sugiro que você enrole a chamada para displayText () com um elenco seqüência explícita:
path = str(self.pathBox.displayText())
xmlFile = str(self.xmlFileBox.displayText())
outFileName = str(self.outfileNameBox.displayText())
A razão é que displayText () retorna o que eu acredito é uma referência de memória constante no nível C ++, o que significa que você não está sendo devolvida uma cópia do QString, mas na verdade o que quer QString está disponível na referência de memória.
Quando você chamar a função displayText (), é a cadeia que o esperado, mas eventualmente ele é outra coisa quando o conteúdo na referência de memória são alterados. Tenho notado essa peculiaridade com vários métodos em diferentes controles, notadamente QDateEdit / QDateTimeEdit / QTimeEdit controles, onde eu normalmente têm de fazer uma cópia explícita de, digamos, o QDate retornado pela função date () do QDateEdit por envolvê-lo em uma construtor QDate.
Método 2:
Caso contrário, use o método de texto () em vez. O QString retornado é um valor constante, em vez de uma referência de memória constante. Veja este doc:
http://doc.trolltech.com/4.4/qlineedit.html # text-prop
displayText : const QString
text : QString
Update:
Parece que Riverbank será abordar este problema em futuras versões do PyQt no caso de alguém ainda está tendo esse problema:
Copiar implícita de const &
Implementado em instantâneos atuais.
Quando PyQt envolve um const & valor retornado por uma função C ++ que envolve o endereço do próprio valor. Além disso, não impor a const atributo. Isto pode causar inesperado behavour (e falhas do programa) seja pelo desaparecimento valor subjacente ou o valor a ser inesperadamente modificada.
A maneira correta de lidar com isso é explicitamente fazer uma cópia do valor usando construtor de cópia do seu tipo. No entanto, isso não é Pythonic e sabendo que precisa ser feito requer o conhecimento da API C ++.
PyQt será alterado para que ele irá invocar automaticamente a cópia construtor e vai envolver a cópia.