Kann man Dialoge mittig anzeigen ?

Verschiedenes zu Qt
Antworten
Kohly
Beiträge: 18
Registriert: 9. April 2010 12:05

Kann man Dialoge mittig anzeigen ?

Beitrag von Kohly »

Kann man bei Aufruf dem Konstruktor irgendwas mitteilen um den

QDialog, QMessageBox etc. beim öffnen mitten im MainWindow anzeigt ?

früher hat man ja die Größe und Position des Mainwindow ausgelesen
und die mitte berechtet. Ist das immer noch eine gängige Methode ?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ja
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Kohly
Beiträge: 18
Registriert: 9. April 2010 12:05

Beitrag von Kohly »

Wenn ich diesen Dialog mittig haben möchte.

Code: Alles auswählen

QString dir = QFileDialog::getExistingDirectory(this, tr("Open Directory"),"/home",QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks);
Muss ich dann eine eigene Klasse schreiben die von QFileDialog erbt, um dem Konstruktor die ausgelesenen Daten zu übergeben ? Oder gibt es da Trick in QT ?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Kohly hat geschrieben:[

Code: Alles auswählen

QString dir = QFileDialog::getExistingDirectory(this, tr("Open Directory"),"/home",QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks);
Muss ich dann eine eigene Klasse schreiben die von QFileDialog erbt, um dem Konstruktor die ausgelesenen Daten zu übergeben ? Oder gibt es da Trick in QT ?
Das ist kein Konstruktor, das ist eine statische Funktion. Du kannst ein QFileDialog-Objekt anlegen, mit den QFileDialog-Methoden initialisieren, so dass das Ding sich verhält wie in der statischen Funktion. Dann ist QDialog auch ein QWidget und kann mit move/resize verschoben/resized werden.
Den Dialog mit "exec" starten und fertig. Ist halt etwas mehr Handarbeit, aber wenn du so was spezielles willst, musst du das in Kauf nehmen. Wenn du das öfter brauchst, kannst du das ja in eine Funktion packen die sich wie die statischen QFileDialog-Methoden bedienen lassen.
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag von Exasperation »

Dann wäre er wieder bei http://qtforum.de/forum/viewtopic.php?t=11321.

Teufelskreis (:
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Exasperation hat geschrieben:Dann wäre er wieder bei http://qtforum.de/forum/viewtopic.php?t=11321.

Teufelskreis (:
Nö! Weil er hoffentlich einsieht dass man nicht ableiten muss! Wenn eine Klasse über das eigene Interface so konfiguriert werden kann, dass man sie an die eigenen Bedürfnisse anpassen kann, ist Ableitung unnötig. Wird es zu viel Code, lagert man den in eine separate Funktion aus.

Ableitung wäre dann nötig, wenn man die Klasse eben um Funktionalität erweitern will, die so noch nicht möglich war. Ob das jetzt im Endeffekt nur Implementierung von virtuellen Funktionen ist, oder Hinzufügen von neuen Membern.

Am einfachsten die Qt-Sourcen hernehmen, den Code von QFileDialog::getExistingDierctory kopieren und in eine eigene FUnktion pasten, zusätzlich den Code zum Zentrieren einfügen und fertig. Dann kannst du überall dein getExistingDirectoryCentered aufrufen.
Kohly
Beiträge: 18
Registriert: 9. April 2010 12:05

Beitrag von Kohly »

Code: Alles auswählen

QString QFileDialog::getExistingDirectory(QWidget *parent,
                                          const QString &caption,
                                          const QString &dir,
                                          Options options)
{
    if (qt_filedialog_existing_directory_hook && !(options & DontUseNativeDialog))
        return qt_filedialog_existing_directory_hook(parent, caption, dir, options);
    QFileDialogArgs args;
    args.parent = parent;
    args.caption = caption;
    args.directory = QFileDialogPrivate::workingDirectory(dir);
    args.mode = (options & ShowDirsOnly ? DirectoryOnly : Directory);
    args.options = options;

#if defined(Q_WS_WIN)
    if (qt_use_native_dialogs && !(args.options & DontUseNativeDialog) && (options & ShowDirsOnly)
#if defined(Q_OS_WINCE)
        && qt_priv_ptr_valid
#endif
        ) {
        return qt_win_get_existing_directory(args);
    }
#endif

    // create a qt dialog
    QFileDialog dialog(args);
    if (dialog.exec() == QDialog::Accepted) {
        return dialog.selectedFiles().value(0);
    }
    return QString();
}

inline static QString _qt_get_directory(const QString &path)
{
    QFileInfo info = QFileInfo(QDir::current(), path);
    if (info.exists() && info.isDir())
        return QDir::cleanPath(info.absoluteFilePath());
    info.setFile(info.absolutePath());
    if (info.exists() && info.isDir())
        return info.absoluteFilePath();
    return QString();
}
Ich hab das hier gefunden. Nur hab ich leider kein Plan wie ich daraus meine eine Funktion machen kann. Ohne in der qfiledialog.h und qfiledialog.cpp rumzupfuschen.
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag von Exasperation »

franzf hat geschrieben:
Exasperation hat geschrieben:Dann wäre er wieder bei http://qtforum.de/forum/viewtopic.php?t=11321.

Teufelskreis (:
Nö! Weil er hoffentlich einsieht dass man nicht ableiten muss! Wenn eine Klasse über das eigene Interface so konfiguriert werden kann, dass man sie an die eigenen Bedürfnisse anpassen kann, ist Ableitung unnötig. Wird es zu viel Code, lagert man den in eine separate Funktion aus.

Ableitung wäre dann nötig, wenn man die Klasse eben um Funktionalität erweitern will, die so noch nicht möglich war. Ob das jetzt im Endeffekt nur Implementierung von virtuellen Funktionen ist, oder Hinzufügen von neuen Membern.

Am einfachsten die Qt-Sourcen hernehmen, den Code von QFileDialog::getExistingDierctory kopieren und in eine eigene FUnktion pasten, zusätzlich den Code zum Zentrieren einfügen und fertig. Dann kannst du überall dein getExistingDirectoryCentered aufrufen.
Das war doch auch in dem Sinne gemeint, dass er sich einfach wieder drüber Gedanken machen muss, bzw. das beherzigt was wir ihm raten.
Ein QFileDialog ist auch nur ein QWidget, das genauso zentriert werden kann.. Ableiten wäre in der Tat völlig unnötig..
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Beitrag von archer »

Wenn du dem Dialog den Zeiger deines Widgets, also den auf dein Mainwindow mitgibst wird er automatisch zetriert. Steht auch in der Dokumentation. Da muß kein move oder irgendetwas gemacht werden.
The function creates a modal file dialog with the given parent widget. If parent is not 0, the dialog will be shown centered over the parent widget.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

archer hat geschrieben:Wenn du dem Dialog den Zeiger deines Widgets, also den auf dein Mainwindow mitgibst wird er automatisch zetriert. Steht auch in der Dokumentation. Da muß kein move oder irgendetwas gemacht werden.
Stimmt. Ich bin aber irgendwie davon ausgegangen, dass er das Ding am Bildschirm zentrieren will. Aber das willl er ja gar nicht, wie ich mir grad nochmal angeschaut hab.
Kohly
Beiträge: 18
Registriert: 9. April 2010 12:05

Beitrag von Kohly »

QMessageBox::critical(this, "Error", "No output directory selected");
Stimmt hiermit geht es aber mit der statischen Funktion getExistingDirectory nicht.

Code: Alles auswählen

QString dir = QFileDialog::getExistingDirectory(NULL, tr("Open Directory"),"/home",QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks);
Wird genauso in der mitte meines Bildschirms angezeigt wie

Code: Alles auswählen

QString dir = QFileDialog::getExistingDirectory(this, tr("Open Directory"),"/home",QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks);
Ich wollte den Dialog ja in der mitte meines MainWindow haben.

----------------------------------------------------------------------------------
Am einfachsten die Qt-Sourcen hernehmen, den Code von QFileDialog::getExistingDierctory kopieren und in eine eigene FUnktion pasten, zusätzlich den Code zum Zentrieren einfügen und fertig. Dann kannst du überall dein getExistingDirectoryCentered aufrufen.
Ich könnte die QT Bibliothek um eine Klasse erweitern die 1:1 wie QFileDialog funzt
und die statische getExistingDirectory überschreiben oder eine neue
Funktion getExistingDirectoryCentered hinzufügen. Ich wollte halt die
Original QT Bibliothek unangetastet lassen.

----------------------------------------------------------------------------------

Gibt es eine noch eine Möglichkeit ?

Die statische Funktion getExistingDierctory ruft ja ein anderes Fenster auf,
als wenn ich mit QFileDialog direkt arbeite. Kann man ein solches Fenster auch per Hand aufrufen,
dann würde ich das auch ohne Probleme mittig bekommen.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Dass es immer nicht geht ist shcon komisch. Kannst du mal schreiben, welches OS + Qt-Version + Compiler du verwendest?

Ansonsten: Beschäftige dich noch mal mit C++-Grundlagen. Hört sich jetzt böse an, ist aber nur gut gemeint.
*) Ist Vererbung im Sinne von Erweiterung hier definitiv NICHT notwendig
*) Fasst man den Sourcecode von verwendeten Libs nur an wenn man einen Bug korrigieren will, und dann schreibt man einen Patch. Das trifft bei dir nicht zu.

Das was du willst ist eine eigene FREIE Funktion. Du sollst gar nicht versuchen, das dann als statische Funktion von QFileDialog hinzubiegen. statische Funktionen kannst du sowieso nicht neu implementieren, ohne sie in eine eigene Klasse/Namensraum mit anderem Namen als dem ursrpünglichen zu packen. So ein Verhalten geht nur mit virtuellen Funktionen (Basisklassenzeiger). Und virtuelle statische Funktionen geht nicht, denn virtuelle Funktionen sind an ein Objekt gebundenm und so eines existiert im Falle einer statischen Funktion nicht.

Du willst sowas:

Code: Alles auswählen

// MyUtilityFunktions.h

#ifndef MY_UTILITY_FUNCTIONS_H
#define MY_UTILITY_FUNCTIONS_H

QString selectDirectory(QWidget *parent, /* weiter Parameter, wenn du sie wirklich brauchst*/ );

#endif

Code: Alles auswählen

// MyUtilityFunctions.cpp

#include "MyUtilityFunktions.h

QString selectDirectory(QWidget *parent, /* usw. */ )
{
    // Und HIER kopierst du den Code der statischen QFileDialog-Funktion rein und änderst ihn ab bis er funktioniert.
    // Wenn es nicht funktioniert, liegt das eben an deiner Plattform ;)
}
Das .cpp kompilierst du in deinem Projekt mit. Bitte NICHT in die QtGui-lib linken, das bringt nix, denn dann verbaust du den Weg auf andere Rechner, die eben nicht deine modifizierte Qt-Libs installiert haben.
Antworten