2016-06-22 14 views
0

Ich habe den Übergang von PyQt4 zu PyQt5 gemacht. Meine App (erstellt mit QtDesigner) hat ein Kontrollkästchen, das eine Schaltfläche "Speichern" aktiviert, falls Sie Ihre Datei speichern möchten. Unter PyQt4 würde sich der Dialog öffnen, ich würde meine Datei wählen, OK drücken, fertig. Ich habe eine Überprüfung der OK-Schaltfläche der Hauptanwendung implementiert, die einen Fehler verursachen würde, wenn der Pfad ungültig wäre, z. wenn Sie Abbrechen in QFileDialog gedrückt haben.Drücken der Taste im QFileDialog-Popup beendet die Anwendung

Mit PyQt5 meine Anwendung beendet vollständig, wenn ich die QFileDialog in irgendeiner Weise schließen (OK, Abbrechen, X). Ich möchte nur den QFileDialog schließen und nicht mein Hauptfenster. Wie mache ich das? Danke für deine Zeit und Hilfe.

Hier ist der relevante Teil meines Code:

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

Edit:

Ich weiß, wo mein Fehler liegt, aber ich kann es immer noch nicht beheben. Ich habe die Zeile im Code markiert. Warum beendet self.ui.savepath_label.setText(path) meine Anwendung?

Antwort

0

Die PyQt4 bietet zwei verschiedene APIs:

  • API v1 die Qt-Typen für Objekte verwendet, so muss man Dinge wie QString zum setText Methode übergeben
  • API v2 verwendet stattdessen Arten Python und die Methoden der Qt-Objekte konvertieren diese Python-Typen automatisch in ihre Qt-Varianten, so dass Sie ihnen einen Python str übergeben müssen.

Dies wird in this page über PyQt4 erwähnt. PyQt5 only supports version 2 of the API (diese Seite erwähnt auch andere Unterschiede).

auch beachten, dass nach der Frage pyqt5 - finding documentation die PyQt5 Methode getSaveFileName ein Paar (filename, filter) tatsächlich zurückkehrt, so ist es effektiv entspricht PyQt4 die getSaveFileNameAndFilter Methode, was bedeutet, dass man einfach nutzen könnte:

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

den Text in .Minimal vollständiges Beispiel:

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

By the way, wenn Sie fname[0]-fname ändern und versuchen, diese Anwendung zu starten vom Terminal Sie folgende hilfreich Fehlermeldung:

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' 

die Ihnen sagt, dass der Rückgabetyp getSaveFileName ein Tupel ist und kein str.

+0

Nachdem ich die Problemumgehung mit 'str()' gefunden habe, bemerkte ich, dass es tatsächlich ein Tupel zurückgeben würde und im Wesentlichen das tat, was Sie in Ihrer Antwort so gut erklärt haben. Danke für deinen sehr aufschlussreichen Post! – Ian

0

Ich fand schließlich die (sehr kleinen) Fehler:

Während PyQt4 offenbar den Pfad automatisch als string schreibt, PyQt5 nicht.

Ich änderte

self.ui.savepath_label.setText(path) 

in

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

und alles ist jetzt gut.