2016-06-22 13 views
0

PyQt4からPyQt5に移行しました。私のアプリ(QtDesignerで作成)にチェックボックスがあり、ファイルを保存したい場合は「保存」ボタンを有効にします。 PyQt4でダイアログが開き、私のファイルを選んでOKを押してください。パスが無効な場合、エラーを促すメインアプリケーションの[OK]ボタンのチェックを実装しました。 QFileDialogでキャンセルを押した場合。QFileDialogポップアップでボタンを押すとアプリケーションが終了する

PyQt5QFileDialogを閉じると(OK、キャンセル、X)、私のアプリケーションは完全に終了します。 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は、2つの異なるAPIを提供します。あなたはsetText方法にQStringのようなものを渡す必要がありますので

  • API v1がAPI v2のではなく、Pythonの型とメソッドを使用しています
  • 、オブジェクトのためのQtのタイプを使用していますQtオブジェクトのうち、自動的にそれらのPython型をQtバリアントに変換するので、Python strを渡す必要があります。

これは、PyQt4についてthis pageに記載されています。 PyQt5 only supports version 2 of the API(そのページには他の違いもあります)

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

をテキストを設定するには:

はまた、質問pyqt5 - finding documentation実際(filename, filter)のペアを返すgetSaveFileNamePyQt5方法によればそれはあなたが簡単に使用できることを意味しPyQt4のgetSaveFileNameAndFilter方法、を効果的に同等だということに注意してください。最小限の完全な例:

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_() 

ところであなたはfnamefname[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) 

を変更し、すべては今良いです。

関連する問題