QFileDialog in ein QWidget integrieren

Alles rund um die Programmierung mit Qt
Antworten
marvel
Beiträge: 105
Registriert: 9. August 2009 07:41

QFileDialog in ein QWidget integrieren

Beitrag von marvel »

ich möchte gerne einen QFileDialog in ein QWidget integrieren, ohne das ein eigenständiger Dialog erzeugt wird. Hat jmd Erfahrung damit ?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Probiers doch aus :D
Funktionieren sollte es, QFileDialog erbt ja indirekt von QWidget. Und einen Grund, warum nur die statischen QFileDialog-Methoden den nativen Filedialog anzeigen und ansonsten was eigenes erzeugt wird, wird es schon geben.

Du darfst ruhig selber was ausprobieren! So lange du nicht mit gefährlichen Systemfunktionen als Root rumspielst, wird schon nix böses passieren:)
marvel
Beiträge: 105
Registriert: 9. August 2009 07:41

Beitrag von marvel »

Hi franzf,
ich habe bereits schon mehrere Stunden versucht das Problem zu lösen, doch leider ohne Erfolg. Egal welche Flags oder Parameter ich benutze der QFileDialog wird immer als eigenständiger Dialog erzeugt und lässt sich nicht in eine QWidget integrieren. Da ich für Windows Mobile programmiere sind eigenständige Dialoge von Nachteil. Gibt es denn etwas ähnliches wie den QFileDialog oder hast du vllt ne Idee wie ich das umsetzen könnte ?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ein Dialog ist ein Dialog und kein Widget.
http://doc.trolltech.com/4.7/qfilesystemmodel.html
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
saar
Beiträge: 11
Registriert: 3. Januar 2011 14:15

Beitrag von saar »

Hallo marvel,

ich hab' sowas mal gemacht um einen File-Dialog in einen Wizard zu integrieren. Hier ist ein kleines Codeschnipsel, das Dir vielleicht weiterhilft:

Code: Alles auswählen

class FileWidget: public QFileDialog
{
	// This class displays a QFileDialog as
	// QWidget. It shows up non modal without
	// open/save/cancel buttons. The accept and
	// reject methods are overwritten to NOP.
public:
	FileWidget(QWidget* parent)
	: QFileDialog(parent)
	{
		setModal(false);
		setWindowFlags(Qt::Widget);
		setSizeGripEnabled(false);
		// hide Open & Cancel buttons
		QDialogButtonBox* buttonBox = findChild<QDialogButtonBox*>("buttonBox");
		if(buttonBox)
		{
			buttonBox->hide();
		}
	};

	virtual ~FileWidget()
	{
	}

	virtual void accept()
	{
		// leave empty to prevent closing of FileWidget when pressing RETURN
	}

	virtual void reject()
	{
		// leave empty to prevent closing of FileWidget when pressing CANCEL
	}
};
Problematisch bei dem Ansatz ist, dass man auf die internen Objektnamen zugreifen muß. Diese habe ich durch Stöbern in den Sourcen erhalten. Wenn diese in der Zukunft durch Qt geändert werden, darf man hier auch den Code anpassen.

Initialisiert wird die Seite bei mir wie folgt:

Code: Alles auswählen

void FileSelectionPage::initPage()
{
	WizardBasePage::initPage();
	m_FileWidget = new FileWidget(this);

	m_FileWidget->setFileMode(QFileDialog::AnyFile);
	m_FileWidget->setAcceptMode(QFileDialog::AcceptSave);
	m_FileWidget->setViewMode(QFileDialog::Detail);
	m_FileWidget->setDefaultSuffix("csv");

	QLineEdit* fileNameEdit = m_FileWidget->findChild<QLineEdit*>("fileNameEdit");
	if(fileNameEdit)
	{
		// register this field to prevent click on Next or Finish
		// when no file has been selected yet. It is not used for
		// any other reason. Use selectedFiles() for access to the
		// files selected.
		registerField("filenameEdit*",fileNameEdit);
	}
	m_FileWidget->move(0,0);
	m_FileWidget->show();
	setMinimumSize(m_FileWidget->size());
}
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Find ich ja lustig. Hier (Linux, x86, qt-4.7.3) geht das problemlos...
Wobei die von Christian vorgeschlagene Lösung (QFileSystemModel) die angenehmste sein sollte.
Nash
Beiträge: 118
Registriert: 27. April 2007 14:49

Beitrag von Nash »

Christian81 hat geschrieben:Ein Dialog ist ein Dialog und kein Widget.
http://doc.trolltech.com/4.7/qfilesystemmodel.html
Ein QDialog ist selbstverständlich ein QWidget(is-a)
Leitet ja direkt davon ab.

Über das options flag kannst du einstellen ob er nativ sein soll oder nicht.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ein QDialog als QWidget zu missbrauchen ist schon etwas fragwürdig. Und vor allem wenn man damit irgendwas versucht hinzubiegen wie hier wo man nichtmal sicher gehen kann dass der Code mit der nächsten Version noch funktioniert. Das ist ein Hack.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Ein QDialog als QWidget zu missbrauchen ist schon etwas fragwürdig
Logisch gesehen, hasst Recht.
Aber abstrakt betrachtet, haben die anderen auch Recht. Die Object-Hirarchie "QDialog ist ein QWidget" laesst sich hier sehr gut in Frage stellen.
Andere Frameworks implementieren es auch anders. Warum die Trolltechler sich fuer diese Lösung entschieden haben :?:

Ciao ...
Nash
Beiträge: 118
Registriert: 27. April 2007 14:49

Beitrag von Nash »

Christian81 hat geschrieben:Ein QDialog als QWidget zu missbrauchen ist schon etwas fragwürdig. Und vor allem wenn man damit irgendwas versucht hinzubiegen wie hier wo man nichtmal sicher gehen kann dass der Code mit der nächsten Version noch funktioniert. Das ist ein Hack.
Ich will ja nicht kleinlich sein, aber die Behauptung,
in QDialog als QWidget zu missbrauchen
ist falsch.
Ein QDialog ist nunmal ein QWidget, deswegen wird da nix missbraucht.

@marvel
Dein Problem ist folgendes, ein Widget integriert man in ein anderes Widget über Layouts.

Code: Alles auswählen

 QApplication app(argc, argv);

   QTabWidget foo;
   QFileDialog* dlg = new QFileDialog;
   dlg->setOption(QFileDialog::ShowDirsOnly);
   foo.addTab(dlg, "FileDialog in a Tab");
   foo.show();

   return app.exec();
funktioniert problemlos unter win.

Hier stellt sich die Frage macht es Sinn ein Dialog in ein Layout zu stecken?! Vielleicht manchmal schon... es ist jedenfalls immer gut die Option zu haben.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Es geht nicht um das prinzipielle einbinden sondern um die dann vorhandene Funktionalität. Ich kann auch ein QMainWindow in ein anderes einbinden aber was bringt es?
Ein QDialog ist von vornherein darauf ausgelegt als Dialog zu fungieren. Wenn dies misachtet wird ist dies ein Mißbrauch bzw. Hack. Wenn es nicht so wäre würden wir keinen QDialog mitsamt seiner Funktionalität brauchen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Nash
Beiträge: 118
Registriert: 27. April 2007 14:49

Beitrag von Nash »

ist ja lustig, genau das hab ich schon gemacht, ein QMainWindow in ein anderes reingehangen.
Ich wollte die bewegbare ToolBar funktionalität, deswegen hatte ich es gemacht. Ein 3D Render-Widget und darüber die Tools, die man sich hin und her schieben kann.

Aber ich geb dir trotzdem recht ein FileDialog o. Dialog in ein Layout einzufügen ist merkwürdig und kein standard Verhalten.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

ist ja lustig, genau das hab ich schon gemacht, ein QMainWindow in ein anderes reingehangen.
Ich wollte die bewegbare ToolBar funktionalität, deswegen hatte ich es gemacht. Ein 3D Render-Widget und darüber die Tools, die man sich hin und her schieben kann.
und genau so lustig ist, das es dafuer all die Klassen gibt, mit denen man sich so ne Toolbar "zusammenklicken" kann ... ohne das QMainWindow zu vergewaltigen :-)
Ob es auf allen Systemen so funktioniert, ist das naechste Problem ...

Nen QDialog und ein QMainWindow haben zwar alle Schnittstellen von QWidget, aber nicht das Verhalten eines Widgets.
Deshalb gilt logisch eigentlich: QDialog ist kein QWidget !
Die Hirarchie QDialog <- QWidget ist IMHO schlechtes Design !
ein FileDialog o. Dialog in ein Layout einzufügen ist merkwürdig und kein standard Verhalten
Und sollte deshalb vom Design nicht ermöglicht werden

Aber "Frameworks" haben eh ihre eigenen Regeln ...

Ciao ...
Antworten