2016-06-22 3 views
0

PyQt4에서 PyQt5으로 전환했습니다. 내 앱 (QtDesigner로 생성)에는 파일을 저장하려는 경우를 대비하여 "저장"버튼을 활성화하는 체크 박스가 있습니다. PyQt4에서 대화 상자가 열리면 내 파일을 선택하고 확인을 누릅니다. 경로가 유효하지 않은 경우 오류 메시지가 표시되는 기본 애플리케이션의 확인 버튼에 대한 확인을 구현했습니다. QFileDialog에서 취소를 누르면QFileDialog 팝업 버튼을 누르면 응용 프로그램이 종료됩니다.

PyQt5 어떤 식 으로든 (OK, 취소, X) QFileDialog을 닫으면 내 응용 프로그램이 완전히 종료됩니다. QFileDialog를 닫고 내 주 창만 닫으려고합니다. 어떻게해야합니까? 시간과 도움에 감사드립니다.

여기 내 코드의 관련 부분 :

self.path = self.ui.savepathButton.pressed.connect(lambda: self.file_save()) 

def file_save(self): 
    path = QFileDialog.getSaveFileName(self, "Choose a path and filename", os.getcwd().replace("\\", "/") + 
             "/test.stl", filter="Stereolithography Files (*.stl)") 
    self.ui.savepath_label.setText(path) <------ NO ERROR WITHOUT THIS LINE 

def OKButton_click(self): 
    if os.path.isdir(os.path.split(self.ui.savepath_label.text())[0]) is False: 
     # Warning if the filename is invalid. 
     file_error = QMessageBox() 
     file_error.setIcon(QMessageBox.Warning) 
     file_error.setText("Invalid path or filename.") 
     file_error.setInformativeText("Please choose a working path and filename.")    file_error.setWindowTitle("File name error") 
     file_error.setStandardButtons(QMessageBox.Ok) 
     file_error.exec_() 
    else: 
     self.accept() 

편집 :

내 오류가있는 위치를 알아,하지만 난 여전히 문제를 해결할 수 없습니다. 코드에 줄을 표시했습니다. self.ui.savepath_label.setText(path) 내 응용 프로그램을 종료하는 이유는 무엇입니까? 분명히 string 자동으로 경로를 기록

PyQt4 동안, PyQt5은하지 않습니다 :

답변

0

PyQt4 두 개의 서로 다른 API를 제공합니다

  • API v1을이 개체에 대한 Qt는 유형을 사용을, 그래서 당신이 setText 방법 QString 같은 것들을 통과해야는
  • API v2는 대신 파이썬 유형과 방법을 사용 Qt 객체는 자동으로 해당 파이썬 유형을 Qt 변형으로 변환하므로 파이썬 str을 전달해야합니다.

이것은 PyQt4에 대해 this page에 언급되어 있습니다. PyQt5 only supports version 2 of the API (그 페이지는 다른 차이점을 언급합니다). 또한

주의 당신이 간단하게 사용할 수 있다는 것을 의미 질문 pyqt5 - finding documentation 실제로 (filename, filter) 한 쌍 그래서 PyQt4의 getSaveFileNameAndFilter 방법에 효과적으로 상당의 반환 getSaveFileNamePyQt5 방법에 따라 :

self.ui.savepath_label.setText(path[0]) 

텍스트를 설정하려면 .최소한의 완벽한 예 : 그런데

from PyQt5.QtWidgets import QFileDialog, QWidget, QApplication, QHBoxLayout, QPushButton 


class Window(QWidget): 
    def __init__(self): 
     super(Window, self).__init__(None) 
     layout = QHBoxLayout() 
     self.button = QPushButton('click') 
     layout.addWidget(self.button) 
     self.setLayout(layout) 
     self.button.clicked.connect(self.ask_filename) 
    def ask_filename(self): 
     fname = QFileDialog.getSaveFileName(self, 'title') 
     print(fname) 
     self.button.setText(fname[0]) 


app = QApplication([]) 
window = Window() 
window.show() 
app.exec_() 

, 당신은 fname-fname[0]을 변경하고 다음 도움이 오류 메시지가 도착 터미널에서이 응용 프로그램을 실행하려고하면 :

Traceback (most recent call last): 
    File "test_qt.py", line 15, in ask_filename 
    self.button.setText(fname) 
TypeError: QAbstractButton.setText(str): argument 1 has unexpected type 'tuple' 

을 알려줍니다 리턴 유형 getSaveFileName은 튜플이며 str이 아님을 유의하십시오.

+0

'str()'에 대한 해결책을 찾았 으면 실제로 튜플을 반환하고 기본적으로 당신이 대답에 대해 잘 설명해주었습니다. 귀하의 매우 통찰력있는 게시물 주셔서 감사합니다! – Ian

0

는 드디어 (아주 작은) 오류를 발견했습니다.

나는

self.ui.savepath_label.setText(str(path)) 

self.ui.savepath_label.setText(path) 

을 변경하고 모두는 지금 좋다.