Domanda

Im scrivendo un piccolo programma Python che passa attraverso un file XML e fa qualche sostituzione di tag. Prende tre argomenti, un percorso da pagherei crea una struttura di directory, il file XML sua lettura e il file xml il suo output su. Funziona bene dalla riga di comando solo di passaggio in argomenti. Come la sua non solo per me, ho pensato id messo un fronte Qt su di esso. Qui di seguito è la maggioranza del fronte Qt. MOVtoMXF è la classe che fa tutto la sostituzione. Così si può vedere che im fondamentalmente solo afferrando stringhe e l'immissione in classe che ive già costruite e collaudate.

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)

il problema soltanto è che quando mi nutro in un percorso, ora torna con un errore, sia per la squadra di directory esiste, o se ho una barra finale sulla fine che

File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/posixpath.py", linea 62, in join     elif percorso == '' o path.endswith ( '/'):

Credo che il suo probabilmente una mancata corrispondenza tra il QFileDialog, il QString suo passaggio indietro e la stringa i miei aspetta pitone. ma non sono sicuro di come fare per risolverlo.

Im in esecuzione su Max OS X 10.5.6 PyQt 4.4.4 QT 4.4.0

Grazie per qualsiasi aiuto si può dare.

Mark

È stato utile?

Soluzione

Due le possibili soluzioni.

Metodo 1:

Se è necessario utilizzare il metodo displayText (), vi consiglio di avvolgere la chiamata a displayText () con un cast stringa esplicita:

path = str(self.pathBox.displayText()) 
xmlFile = str(self.xmlFileBox.displayText()) 
outFileName = str(self.outfileNameBox.displayText())

La ragione è che displayText () restituisce quello che credo sia un punto di riferimento della memoria costante a livello di C ++, il che significa che non vengono restituiti una copia del QString, ma in realtà tutto ciò che QString è disponibile al riferimento di memoria.

Quando si chiama la funzione displayText (), è la corda che vi aspettavate, ma alla fine si tratta di qualcosa di diverso quando il contenuto al riferimento di memoria vengono modificati. Ho notato questa peculiarità con diversi metodi su diversi controlli, più in particolare i controlli / QDateTimeEdit / QTimeEdit QDateEdit, dove mi hanno in genere a fare una copia esplicita di, diciamo, il QDate restituita dalla funzione data () del QDateEdit avvolgendolo in un QDate costruttore.

Metodo 2:

In caso contrario, utilizzare il metodo di testo (), invece. Il QString restituito è un valore costante, invece di un riferimento costante memoria. Vedere questo documento:

http://doc.trolltech.com/4.4/qlineedit.html # text-prop

displayText : const QString 
text : QString

Aggiornamento:

Sembra che Riva del fiume sarà affrontare questo problema nelle future versioni di PyQt in caso qualcuno si continui ad avere questo problema:

PyQt4 tabella di marcia

  

Copia implicito di const &

     

Implementato in istantanee attuali.

     

Quando PyQt avvolge una const & valore   restituita da una funzione C ++ avvolge   l'indirizzo del valore stesso. Anche,   esso non impone il const   attributo. Ciò può causare inaspettato   behavour (e programma si blocca) o   dalla scomparsa sottostante   o il valore di essere inaspettatamente   modificato.

     

Il modo corretto per gestire questa situazione è quello di   fare esplicitamente una copia del valore   usando costruttore di copia del suo tipo.   Tuttavia, questo non è Pythonic e   sapendo che deve essere fatto   richiede la conoscenza della ++ C API.

     

PyQt verrà modificato in modo che possa   richiamare automaticamente la copia   costruttore e vi avvolgerà la copia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top