Seite 1 von 1

Abfragedialog mit static Get* - Funktion

Verfasst: 6. Dezember 2008 16:50
von slash-ex
Mir ist bei den von QDialog abgeleiteten Klassen aufgefallen, dass diese static deklarierte Funktionen besitzen um den Inhalt zurückzugeben. Ich verstehe nur nicht ganz wie diese Funktionen funktionieren können, ohne zu wissen was in der Klasse passiert.
Weis jemand, wie solch eine Funktion grundsätzlich aufgebaut ist?
Solche Funktionen müssen ja:
- das Widget anzeigen
- die Inhalte des Widgets connecten
- bei einem bestimmten Event einen Rückgabewert returnen

Verfasst: 6. Dezember 2008 17:30
von Christian81
Welche Funktionen genau meinst Du?

Verfasst: 6. Dezember 2008 21:17
von slash-ex
Z.B. die "QStringList selectedFiles () const" im "QFileDilaog". Ich spiele mit dem Gedanken, dass man dort alle Member in der Klasse als static deklariert hat und damit dann auch Zugriff über die static Memberfunktionen hat. Bin allerdings nicht sonderlich geübt mit diesem Schlüsselwort.

Verfasst: 6. Dezember 2008 21:34
von Christian81
QFileDialog::selectedFiles () ist nicht static ...

Verfasst: 6. Dezember 2008 21:36
von upsala
selectedFiles() ist nicht statisch. Ansonsten sind die Sourcen von Qt manchmal auch sehr aufschlußreich...

Verfasst: 6. Dezember 2008 23:56
von slash-ex
whatever, hatte mich auch verlesen:
QString getOpenFileName ist static. und wenn ich Lust hätte mir 60mb Sourcen zu laden, anstatt gleich in einem Forum evtl Hilfe zu suchen, dann hätte ich das sicherlich gemacht. Aber da man die hier anscheinend nicht bekommt muss ich das wohl tun. Wobei ich zugeben muss, dass es unklug war, eine falsche Funktion zu posten. sry

Verfasst: 7. Dezember 2008 08:41
von franzf
Wie machst du es denn, wenn du aus einem Slot heraus einen Dialog öffnest, z.B. um deine Settings zu bearbeiten? Irgend welche Properties für ein Objekt zu setzen? Da gehst du doch auch nicht her und machst dir einen private/static Member deiner Klasse für jeden Pfurz, oder?
Ja, genau. Du erstellt erst im SLOT ein Objekt deiner abgeleiteten Dialog-Klasse, führst den Dialog mit exec() aus und fängst dessen Rückgabewert ab (Accepted etc.). Danach kannst du auf die Methoden deines Dialogs zugreifen, um die eingestellten Werte zu bekommen.

Nicht anders ist das mit den static-Methoden, nur mit der Ausnahme des "qt_filedialog_open_filename_hook" und den zwei "#if defined" im Beispiel des getOpenFileName:

Code: Alles auswählen

QString QFileDialog::getOpenFileName(QWidget *parent,
                               const QString &caption,
                               const QString &dir,
                               const QString &filter,
                               QString *selectedFilter,
                               Options options)
{
    if (qt_filedialog_open_filename_hook)
        return qt_filedialog_open_filename_hook(parent, caption, dir, filter, selectedFilter, options);
    QFileDialogArgs args;
    args.parent = parent;
    args.caption = caption;
    args.directory = QFileDialogPrivate::workingDirectory(dir);
    args.selection = QFileDialogPrivate::initialSelection(dir);
    args.filter = filter;
    args.mode = ExistingFile;
    args.options = options;
#if defined(Q_WS_WIN)
    if (qt_use_native_dialogs && !(args.options & DontUseNativeDialog)) {
        return qt_win_get_open_file_name(args, &(args.directory), selectedFilter);
    }
#elif defined(Q_WS_MAC)
    if (qt_use_native_dialogs && !(args.options & DontUseNativeDialog)) {
        if (dir.isEmpty())
            args.directory = dir;
        QStringList files = qt_mac_get_open_file_names(args, &(args.directory), selectedFilter);
        if (!files.isEmpty())
            return files.first().normalized(QString::NormalizationForm_C);
        return QString();
    }
#endif

    // create a qt dialog
    QFileDialog dialog(args);
    if (selectedFilter)
        dialog.selectNameFilter(*selectedFilter);
    if (dialog.exec() == QDialog::Accepted) {
        if (selectedFilter)
            *selectedFilter = dialog.selectedFilter();
        return dialog.selectedFiles().value(0);
    }
    return QString();
}
Grüße
Franz