문제

나는 XML 파일을 통해 태그를 교체하는 작은 Python 프로그램을 작성하고 있습니다.디렉터리 트리를 생성하는 경로, 읽는 XML 파일, 출력하는 xml 파일 등 세 가지 인수를 사용합니다.인수만 전달하면 명령줄에서 제대로 작동합니다.나만을 위한 것이 아니기 때문에 Qt 전면을 배치해야 한다고 생각했습니다.아래는 Qt 전면의 대부분입니다.MOVtoMXF는 모든 교체를 수행하는 클래스입니다.따라서 저는 기본적으로 문자열을 잡고 이미 만들고 테스트한 클래스에 문자열을 입력하고 있다는 것을 알 수 있습니다.

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)

문제는 내가 Path를 입력할 때 디렉토리가 존재하지 않거나 끝에 슬래시가 있는 경우 오류가 발생한다는 것입니다.

"/system/library/frameworks/python.framework/versions/2.5/lib/python2.5/posixpath.py", 62 행, Enif Path == ''또는 Path.endSwith ( '/') 파일 : "/') :

나는 아마도 QFileDialog, QString이 다시 전달되는 것과 내 파이썬이 기대하는 문자열 사이에 약간의 불일치가 있다고 생각합니다.하지만 어떻게 고쳐야 할지 잘 모르겠어요.

Max OS X 10.5.6에서 실행 중입니다. 파이 Qt 4.4.4 QT 4.4.0 버전

당신이 줄 수 있는 도움에 감사드립니다.

표시

도움이 되었습니까?

해결책

두 가지 잠재적인 솔루션.

방법 1:

displayText() 메서드를 사용해야 하는 경우 명시적인 문자열 캐스팅을 사용하여 displayText()에 대한 호출을 래핑하는 것이 좋습니다.

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

그 이유는 displayText()가 C++ 수준에서 상수 메모리 참조라고 생각하는 것을 반환하기 때문입니다. 즉, QString의 복사본이 반환되지 않고 실제로 메모리 참조에서 사용할 수 있는 모든 QString이 반환된다는 의미입니다.

displayText() 함수를 호출하면 예상한 문자열이지만 메모리 참조의 내용이 변경되면 결국 다른 문자열이 됩니다.나는 다른 컨트롤, 특히 QDateEdit/QDateTimeEdit/QTimeEdit 컨트롤의 여러 메서드에서 이러한 특징을 발견했습니다. 여기서 일반적으로 QDateEdit의 date() 함수에 의해 반환된 QDate를 다음과 같이 명시적으로 복사해야 합니다. QDate 생성자.

방법 2:

그렇지 않으면 대신 text() 메서드를 사용하세요.반환된 QString은 상수 메모리 참조 대신 상수 값입니다.이 문서를 참조하세요:

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

displayText : const QString 
text : QString

업데이트:

Riverbank는 여전히 이 문제를 겪고 있는 사람이 있을 경우를 대비하여 PyQt의 향후 버전에서 이 문제를 해결할 것으로 보입니다.

PyQt4 로드맵

const&의 암시적 복사

현재 스냅샷에 구현되었습니다.

PyQt가 const& 값을 래핑할 때 래핑하는 C++ 함수에 의해 반환됩니다. 값 자체의 주소입니다.또한 const를 적용하지 않습니다. 속성.이로 인해 예기치 않은 문제가 발생할 수 있습니다. behavour (및 프로그램 충돌) 중 하나 근본적인 가치가 사라지는 것에 의해 또는 예기치 않게 값이 으로 바뀌었습니다.

이를 처리하는 올바른 방법은 다음과 같습니다. 명시적으로 값의 복사본을 만듭니다. 해당 형식의 복사 생성자를 사용합니다.그러나 그것은 파이썬이 아니며 그것이 이루어져야 한다는 것을 알고 있습니다 C++ API에 대한 지식이 필요합니다.

PyQt는 다음과 같이 변경됩니다. 복사본 자동 호출 생성자를 생성하고 복사본을 래핑합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top