Question

Im écrire un petit programme de python qui passe par un fichier XML et fait le remplacement de certains tags. Il prend trois arguments, un chemin de whcih il crée une arborescence de répertoires, le fichier XML de sa lecture et le fichier xml son délivrer en sortie. Il fonctionne très bien à partir de la ligne de commande de passage dans les arguments. Comme son non seulement pour moi, je pensais id mettre un front Qt dessus. Ci-dessous la majorité de l'avant Qt. MOVtoMXF est la classe qui fait tout le remplacement. Ainsi, vous pouvez voir que im fondamentalement juste saisir les chaînes et les introduire dans la classe qui ive déjà fait et testé.

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)

le probelm est que quand je nourris dans un chemin, il est maintenant de retour avec une erreur, que ce soit le répertoire ne marche pas existe, ou si j'ai un slash à la fin que

Fichier "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/posixpath.py", ligne 62, à se joindre à     elif chemin == '' ou path.endswith ( '/'):

Je pense qu'il ya probablement une certaine disparité entre les QFileDialog, le QString son passage en arrière et la chaîne des mes python attend. mais je ne suis pas sûr de savoir comment s'y prendre pour le fixer.

Im en cours d'exécution sur Max OS X 10.5.6 PyQt 4.4.4 QT 4.4.0

Merci pour toute aide que vous pouvez donner.

Mark

Était-ce utile?

La solution

Deux solutions possibles.

Méthode 1:

Si vous devez utiliser la méthode displayText (), je vous suggère envelopper l'appel à displayText () avec un casting de chaîne explicite:

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

La raison en est que displayText () retourne ce que je crois est une référence mémoire constante au niveau C ++, ce qui signifie que vous n'êtes pas retourné une copie du QString, mais en fait tout QString est disponible à la référence mémoire.

Lorsque vous appelez la fonction displayText (), il est la chaîne que vous attendiez, mais finalement il est autre chose lorsque le contenu de la référence mémoire sont modifiés. Je l'ai remarqué cette particularité avec plusieurs méthodes sur différents contrôles, et plus particulièrement QDateEdit / QDateTimeEdit / contrôles QTimeEdit, où j'ai généralement de faire une copie explicite, disons, le QDate retourné par la fonction date () de QDateEdit en l'enveloppant dans un constructeur QDate.

Méthode 2:

Dans le cas contraire, utilisez la méthode text () à la place. La QString retournée est une valeur constante, au lieu d'une référence mémoire constante. Voir ce document:

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

displayText : const QString 
text : QString

Mise à jour:

On dirait que Riverbank se penchera sur ce problème dans les futures versions de PyQt dans le cas où tout le monde est d'avoir encore ce problème:

Feuille de route PyQt4

  

Copie implicite de const &

     

Mis en œuvre en cours instantanés.

     

Quand PyQt enveloppe const & valeur   renvoyé par une fonction C ++ elle enveloppe   l'adresse de la valeur elle-même. Aussi,   il ne l'applique pas const   attribut. Cela peut causer inattendu   Behavour (et les collisions programme) soit   par la valeur sous-jacente disparaissant   ou la valeur étant de façon inattendue   modifié.

     

La bonne façon de gérer cela est de   faire explicitement une copie de la valeur   en utilisant le constructeur de copie de son type.   Cependant, ce n'est pas Pythonic et   sachant qu'il doit faire   exige une connaissance de l'API C.

     

PyQt sera modifiée de sorte qu'il sera   invoquer automatiquement la copie   constructeur et se terminera la copie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top