Seite 1 von 1

QFiledialog aus einem Dialog heraus öffnen

Verfasst: Freitag 28. April 2017, 19:55
von nieselfriem
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

Re: QFiledialog aus einem Dialog heraus öffnen

Verfasst: Freitag 28. April 2017, 23:59
von 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.

Re: QFiledialog aus einem Dialog heraus öffnen

Verfasst: Samstag 29. April 2017, 11:19
von nieselfriem
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

Re: QFiledialog aus einem Dialog heraus öffnen

Verfasst: Samstag 29. April 2017, 14:34
von 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. :-)