Kann man Dialoge mittig anzeigen ?
Kann man Dialoge mittig anzeigen ?
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 ?
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:
Wenn ich diesen Dialog mittig haben möchte.
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 ?
Code: Alles auswählen
QString dir = QFileDialog::getExistingDirectory(this, tr("Open Directory"),"/home",QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks);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.Kohly hat geschrieben:[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 ?Code: Alles auswählen
QString dir = QFileDialog::getExistingDirectory(this, tr("Open Directory"),"/home",QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks);
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
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.Exasperation hat geschrieben:Dann wäre er wieder bei http://qtforum.de/forum/viewtopic.php?t=11321.
Teufelskreis (:
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.
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();
}-
Exasperation
- Beiträge: 186
- Registriert: 11. März 2009 18:00
- Wohnort: VS
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.franzf hat geschrieben: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.Exasperation hat geschrieben:Dann wäre er wieder bei http://qtforum.de/forum/viewtopic.php?t=11321.
Teufelskreis (:
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.
Ein QFileDialog ist auch nur ein QWidget, das genauso zentriert werden kann.. Ableiten wäre in der Tat völlig unnötig..
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.
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.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.
QMessageBox::critical(this, "Error", "No output directory selected");
Stimmt hiermit geht es aber mit der statischen Funktion getExistingDirectory nicht.
Wird genauso in der mitte meines Bildschirms angezeigt wie
Ich wollte den Dialog ja in der mitte meines MainWindow haben.
----------------------------------------------------------------------------------
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.
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);
Code: Alles auswählen
QString dir = QFileDialog::getExistingDirectory(this, tr("Open Directory"),"/home",QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks);
----------------------------------------------------------------------------------
Ich könnte die QT Bibliothek um eine Klasse erweitern die 1:1 wie QFileDialog funztAm 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.
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.
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:
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.
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*/ );
#endifCode: 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 ;)
}