QFileDialog passando directory di script python
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
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:
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.