QFiledialog aus einem Dialog heraus öffnen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
nieselfriem
User
Beiträge: 135
Registriert: Sonntag 13. Januar 2013, 16:00

Hallo,

ich habe einen Modalen Dialog. Aus diesem möchte ich nach einer auswahl von parametern ein Filedialog öffnen.

Code: Alles auswählen

from PyQt5 import QtCore, QtGui, QtWidgets
from Database.DatabaseOperations import *

class CreateReport_Dialog(object):
    ownerId = None
    firmId = None
    format = None

    def setupUi(self, createreport):
        createreport.setObjectName("Dialog")
        createreport.resize(400, 300)
        self.buttonBox = QtWidgets.QDialogButtonBox(createreport)
        self.buttonBox.setGeometry(QtCore.QRect(20, 230, 341, 32))
...

    def createReport(self):
        msgbx = DataChangeMsgBx()
        check_input_list = self.check_input()
        print(check_input_list)
        if len(check_input_list) > 0:
            error_strg = "\n".join(check_input_list)
            msgbx.checkInputsMsgBx(error_strg)
        else:
            print("==== self:", self)
            fileName = QFileDialog.getSaveFileName(self, 'Dialog Title', '/path/to/default/directory', selectedFilter='*.txt') #Fehler
Hier kommt es jedoch zur Fehlermeldung.

Code: Alles auswählen

TypeError: getSaveFileName(parent: QWidget = None, caption: str = '', directory: str = '', filter: str = '', initialFilter: str = '', options: Union[QFileDialog.Options, QFileDialog.Option] = 0): argument 1 has unexpected type 'CreateReport_Dialog'
Laut der Dokumentation wird QWidget verlangt. Ist denn mein Dialog "CreateReport_Dialog" kein QWidget? und wenn nein, wie ist mir möglich, aus einem Dialog heraus ein Filedialog zu öffnen?

VG niesel
BlackJack

@nieselfriem: Warum denkst Du `CreateReport_Dialog` wäre ein `QWidget`? Das erbt von `object`.

`ownerId`, `firmId`, und `format` haben dort auf Klassenebene nichts zu suchen. Und eventuell bedeutet `firm` nicht das was Du im Sinn hast.

Der `setGeometry()`-Aufruf erweckt den Verdacht das man das nur auf deinem oder Rechnern mit sehr ähnlichen Grafikeinstellungen und Displays verwenden sollte oder gar kann. Absolute platzierung von Anzeigeelementen ist nicht nur ”unmodern” sondern bei der Vielfalt an Systemen und Displays und deren Grössen und Auflösungen echt ein Problem.
Benutzeravatar
nieselfriem
User
Beiträge: 135
Registriert: Sonntag 13. Januar 2013, 16:00

Hi,

ok, es ist etwas unsauber mit den Variablen. Diese gehören in den Konstrukor. Gut, dass mein Dialog von object erbt, hätte man sehen können und das ist ja offenbar auch das Problem, warum mir der FileDialog nicht geöffnet wird. Diesen Dialog habe ich mit QR-Designer zusammengebastl. Das hier setGeometry verwendet wird, liegt also am generierten Code. Das ist aber auch nicht schlimm, da das Programm nur für mich oder ggf. für meine Freundin verwendet werden soll. Mag etwas kurzsichtig sein, ist mir im Moment aber NOCH egal. ;)

Das soll nicht bedeuten, dass ich die Hinweise nicht annehmen werde

Nun stellt sich aber dennoch trotz der oberen Unzulänglichkeiten in meinem Code die Frage, wie ich ein FileDialog aus meinem Dialog öffnen kann?

VG niesel
BlackJack

@nieselfriem: Das `setGeometry()` liegt an Dir — Du hast die GUI doch im Designer entworfen und dabei zumindest dieses Element absolut positioniert statt ein Layout zu verwenden. Ob man diese Entscheidung im Designer oder in handgeschriebenem Code trifft, ändert am Ergebnis ja nichts.

Veränderst Du tatsächlich den generierten Code? Da sollte eigentlich ein Kommentar am Anfang stehen der davon abrät. Sonst kannst Du ja nichts mehr an der GUI ändern ohne das beim nächsten generieren der Datei Dein Code überschrieben wird. Ich würde auch gar keinen Code mehr generieren sondern einfach die *.ui-Datei zur Laufzeit laden.

Die Einbindung sieht auch insgesamt komisch aus. Normalerweise erbt man ja von der generierten Datei und der Qt-Widget-Klasse die von der UI-Datei vorausgesetzt wird. Dann hat man a) die generierte Datei separat und muss da nichts dran ändern, und b) ist diese Klasse dann auch vom richtigen Typ, um zum Beispiel bei `QFileDialog.getSaveFileName()` übergeben werden zu können.

Wenn man das ganze also so verwendet wie die Dokumentation das vormacht, dann funktioniert's auch. :-)
Antworten