Pregunta

Estoy escribiendo un pequeño programa en Python que pasa a través de un archivo XML y hace algo de sustitución de las etiquetas. Toma tres argumentos, un camino desde lo que se agradece que crea un árbol de directorios, el archivo XML de su lectura y el archivo XML de su salida a. Funciona bien desde la línea de comandos de paso de argumentos. Ya que no es sólo para mí, pensé Identificación ponen un frente Qt en él. A continuación se muestra la mayoría de la parte delantera de Qt. MOVtoMXF es la clase que hace todo el reemplazo. Así se puede ver que, básicamente, sólo im agarrar las cuerdas y la alimentación de ellos en la clase que ya ive hecho y probado.

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)

la probelm es que cuando se alimentan en un camino, que ahora vuelve con un error, existe tampoco el imposible de directorio, o si tengo una barra final en el extremo que

Archivo "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/posixpath.py", línea 62, en unirse     camino elif == '' o path.endswith ( '/'):

Creo que es probablemente una falta de coincidencia entre la QFileDialog, el QString su paso hacia atrás y la cadena de los mis Espera pitón. pero no estoy seguro de cómo ir sobre la fijación de la misma.

Im corriendo en Max OS X 10.5.6 4.4.4 pyqt QT 4.4.0

Gracias por cualquier ayuda que puede dar.

Marcar

¿Fue útil?

Solución

Dos posibles soluciones.

Método 1:

Si tiene que usar el método displayText (), sugiero que se coloca la llamada a displayText () con un reparto cadena explícito:

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

La razón es que displayText () devuelve lo que creo que es una referencia a memoria constante en el nivel C ++, lo que significa que no se están devolviendo una copia del QString, pero en realidad lo QString está disponible en la referencia de memoria.

Cuando se llama a la función displayText (), que es la cadena que esperaba, pero con el tiempo es algo más cuando se cambian los contenidos en la referencia de memoria. Me he dado cuenta esta peculiaridad con varios métodos en diferentes controles, más notablemente los controles / QDateTimeEdit / QTimeEdit QDateEdit, donde por lo general tiene que hacer una copia explícita de, por ejemplo, el método QDate devuelto por la función date () de QDateEdit envolviéndolo en una constructor método QDate.

Método 2:

Si no, utilizar el método de texto () en su lugar. El QString devuelto es un valor constante, en lugar de una referencia de memoria constante. Ver este documento:

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

displayText : const QString 
text : QString

Actualización:

Parece que Ribera se dirigirá a este problema en futuras versiones de PyQt en caso de que alguien sigue teniendo este problema:

PyQt4 Roadmap

  

Copia implícito const y

     

Implementado en las instantáneas actuales.

     

Cuando PyQt envuelve una constante y el valor   devuelto por un C ++ función de TI envuelve   la dirección del propio valor. También,   no hace cumplir la const   atributo. Esto puede causar inesperado   Behavour (y programa se bloquea) o bien   por el valor subyacente desaparición   o el valor de ser inesperadamente   modificado.

     

La forma correcta de manejar esto es   explícitamente hacer una copia del valor   usando constructor de copia de su tipo.   Sin embargo, eso no es Pythonic y   sabiendo que hay que hacer   requiere el conocimiento de API el C ++.

     

PyQt se cambiará de modo que se   invocar automáticamente la copia   constructor y envolverá la copia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top