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

Foi útil?

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:

PyQt4 Roteiro

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top