Abfragedialog mit static Get* - Funktion

Alles rund um die Programmierung mit Qt
Antworten
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Abfragedialog mit static Get* - Funktion

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Welche Funktionen genau meinst Du?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

QFileDialog::selectedFiles () ist nicht static ...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

selectedFiles() ist nicht statisch. Ansonsten sind die Sourcen von Qt manchmal auch sehr aufschlußreich...
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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
Antworten