Seite 1 von 1

Kann man Dialoge mittig anzeigen ?

Verfasst: 10. April 2010 22:07
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 ?

Verfasst: 10. April 2010 23:23
von Christian81
Ja

Verfasst: 12. April 2010 15:39
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 ?

Verfasst: 12. April 2010 15:53
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.

Verfasst: 12. April 2010 15:57
von Exasperation
Dann wäre er wieder bei http://qtforum.de/forum/viewtopic.php?t=11321.

Teufelskreis (:

Verfasst: 12. April 2010 16:24
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.

Verfasst: 12. April 2010 18:06
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.

Verfasst: 13. April 2010 10:21
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..

Verfasst: 13. April 2010 11:05
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.

Verfasst: 13. April 2010 14:15
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.

Verfasst: 13. April 2010 17:15
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.

Verfasst: 14. April 2010 16:25
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.