Pyqt5 – finding dokumentation

Ich habe meinen Weg durch Summerfields Buch über Rapid GUI Programmierung mit Python und QT … pyqt gearbeitet, um Preiser zu sein, aber das Buch von 2007 verwendet Version 4.something und ich versuche, mit der aktuellen Version 5.4.2 zu gehen. .

Es gibt einige Änderungen, die ich versuche, herauszufinden und würde lieber etwas Hilfe auf, wie man Sachen findet. Hier ist ein Beispiel für eine Datei speichern Dialog – aus dem Buch:

fname = QFileDialog.getSaveFileName(self, "Image Changer - Save Image", fname, "Image files ({})".format(" ".join(formats))) 

Das funktioniert nicht, vielleicht vor allem weil in pyqt5 der QFileDialog ein Tupel anstatt einen String zurückgibt. Der einzige Weg, den ich herausfinden kann, ist nur durch Versuch und Irrtum. Die pyqt5-Dokumentation verweist auf QT, die ich wirklich nicht verstehe.

Ich habe die folgenden zu arbeiten:

  fname = QFileDialog.getSaveFileName(self, 'some text', "whatever.png", '*.png') if "." not in fname[0]: fname[0] += ".png" self.addRecentFile(fname[0]) self.filename = fname[0] return self.fileSave() 

Wow, es funktioniert! Aber es ist nur durch das Durcheinander, dass ich irgendwelche Fortschritte bekomme. Ich habe versucht, Python-Interpreter zu betreiben und tippte:

 from PyQt5.QtWidgets import QFileDialog help(QFileDialog) 

Dies ist (Art von) hilfreich, aber die Syntax der Hilfe macht mir nicht viel Sinn, und ich sehe nicht, was getSaveFileName zurückkehren soll. Dies ist etwas langweilig – @ $$ Zeug.

Was vermisse ich?

2 Solutions collect form web for “Pyqt5 – finding dokumentation”

Einige der statischen Funktionen von QFileDialog haben eine ungerade Geschichte in PyQt. Wenn Sie diese Geschichte nicht kennen, ist es schwer, die Unterschiede zwischen den verschiedenen Versionen von PyQt zu verstehen.

Das zugrunde liegende Problem ist ganz einfach. In Python, wenn eine Funktion mehr als einen Wert zurückgeben muss, ist die häufigste Lösung, ein Tupel zurückzugeben. Aber in C ++ ist das nicht wirklich möglich, also ist die übliche Lösung stattdessen Argumente, die modifiziert werden können.

Die C ++ – Signatur von QFileDialog.getSaveFileName ist:

 getSaveFileName( QWidget * parent = 0, const QString & caption = String(), const QString & dir = QString(), const QString & filter = QString(), QString * selectedFilter = 0, Options options = 0) 

Wie Sie sehen können, sind die vier QString Argumente nicht alle gleich. Die ersten drei sind const , und so wird nicht durch die Funktion modifiziert werden, aber das selectedFilter Argument nimmt einen Zeiger auf einen QString , was bedeutet, dass es sein kann.

Ursprünglich war die Hauptnutzung von PyQt für C ++ – Proto-Typisierung (anstatt Python-Anwendungen zu entwickeln), und so waren seine APIs den Qt-APIs viel mehr treu. Dies bedeutete, dass bis zu PyQt-4.6 die einzige Möglichkeit, den ausgewählten Filter von QFileDialog zu bekommen, war es, den C ++ – Weg zu machen, wie QFileDialog :

 >>> s = QString() # string to be modified >>> f = QFileDialog.getSaveFileName(None, 'Save', '', 'Img(*.png *.jpg)', s) >>> print s Img(*.png *.jpg) 

Und in der Tat, das funktioniert immer noch in aktuellen Versionen von PyQt4 (vorausgesetzt, es hat QString aktiviert, natürlich).

PyQt4 stellte stetig viele Veränderungen vor, die allmählich mehr und mehr Python-freundlich im Laufe der Jahre gemacht haben – aber wie das obige Beispiel zeigt, war dies alles getan, ohne Rückwärts-Kompatibilität zu brechen. Zu der Zeit, das Ändern der Signatur von getSaveFileName , um ein Tupel zurückzugeben, hätte viel zu viel Bruch verursacht, und so wurden wie getSaveFileNameAndFilter als temporärer Kompromiss hinzugefügt.

PyQt5 hat keine solchen Einschränkungen (es muss nicht einmal QString mehr zur Verfügung QString ). So ist es endlich möglich, das Richtige zu tun (aus Python-Sicht) und getSaveFileName einfach ein Tupel aus getSaveFileName . Und dieses Prinzip gilt nun generell: Wenn du PyQt5 benutzt hast und du eine Funktion in den Qt-Dokumenten sehst, die seine Argumente modifiziert, kannst man immer erwarten, dass ein Tupel stattdessen zurückgegeben wird.


(PS: Benutzer von PySide – das ist viel jünger als PyQt – mussten sich noch nie mit diesen Problemen beschäftigen. Für sie haben die statischen QFileDialog Funktionen immer das Richtige getan).

Diese Methoden von QFileDialog scheinen etwas Besonderes zu sein, da PyQt ihre eigenen Methoden implementiert hat, anstatt die Qt-Methoden direkt zu verpacken.

Erstens implementiert die Methode PyQt5 QFileDialog.getSaveFileName() das Verhalten der QFileDialog.getSaveFileNameAndFilter() Methode aus PyQt4 ( source ). Zweitens gibt die Methode QFileDialog.getSaveFileNameAndFilter() in PyQt4 ein Tupel von (filename, selectedFilter) ( Quelle ) zurück.

Als Referenz ist die aufrufende Signatur der PyQt4 QFileDialog.getSaveFileNameAndFilter() -Methode

 getSaveFileNameAndFilter (QWidget parent = None, QString caption = QString(), QString directory = QString(), QString filter = QString(), QString initialFilter = QString(), Options options = 0) 

Hoffentlich hilft dies, jede Verwirrung zu lösen. Die meisten PyQt5 Klassen / Methoden werden nicht so verwirrend sein, zu dekodieren!

  • Ist es möglich, QWebKit zur Anzeige von PDF-Dateien zu bekommen?
  • Gibt es eine Möglichkeit, die Position eines QIcon innerhalb eines QTableWidgetItem auszurichten oder zu manipulieren?
  • Einfügen in das Feld von QTableView
  • Reduzieren Sie python interaktive Hilfe ()
  • Problem beim Versuchen, pyside-Objekt zu kopieren
  • Wie kann ich die Farbe von QWidget einstellen?
  • Fenster aus der Taskleiste ausblenden
  • Immer tastaturereignisse mit pyqt
  • PySide Qt: Automatisches vertikales Wachstum für TextEdit Widget und Abstand zwischen Widgets in einem vertikalen Layout
  • PyQt5 - Wie kann ich den Designer starten?
  • Hyperlinks in QTreeView ohne QLabel
  • Python ist die beste Programmiersprache der Welt.