Hallo Forum,
ich habe folgende Frage und zwar, ist es sinnvoll oder spricht etwas dagegen oder ist es auch einfach nur unschön, wenn man bei einer Anwendung, die mit MDI Fenstern läuft, mehrere Instanzen von QMainWindow zu erzeugen? Sprich, dass in jedem MDI-Fenster später ein unterschiedliches Widget bzw. QMainWindow läuft?
Ich will bspw. eine QToolBar in einem Fenster benutzen können und das habe ich mit einem Fenster von QWidget abgeleitet nicht auf die reihe bekommen.
Vielen Dank für Antworten und Anregungen,
Marcus
Mehrer Instanzen von QMainWindow als MDI sinnvoll?
-
Marcus Breuer
- Beiträge: 113
- Registriert: 31. März 2011 17:19
- Wohnort: Aachen
- Kontaktdaten:
-
dennisDennis
- Beiträge: 17
- Registriert: 23. September 2011 16:21
Re: Mehrer Instanzen von QMainWindow als MDI sinnvoll?
Mein Chef würde mir dafür die Rübe abhauen.
Das gleiche gilt für Dialoge mit Menubars.
Das gleiche gilt für Dialoge mit Menubars.
Re: Mehrer Instanzen von QMainWindow als MDI sinnvoll?
Eigentlich isses unschoen ... auch wenns technisch geht.
Generell fuer MDI Anwendungen:
- Es sollte nur ein MDI Master Fenster geben ... Also 1 QMainWIndow
- Wie die ChildFenster dargestellt werden, bestimmt der Master (Manager)
- Ob Childs eigene Toolbars/Menues haben, oder ob das Menu /Toolbar des Masters Expandiert wird (mittlerweile standard in vielen systemen), entscheidet der der Style (Systemabhaengig).
....
Noch weiter z.b. gehen Gnome/Unity / Mac Anwendungen. da hat das Applikationsfenster nich mal ein menu, sondern das wird vom System dargestellt.
Wenn du Menu's/Toolbars in deine Widgets "hart" reinknallst, bekommst du zumindest Anwendungen, die irgendwie optisch nicht ins system passen, oder sogar Probleme ...
Weichst du von sowas ab, willst ne eigene "Lösung", kannst du das MDI system von QT nimmer verwenden! d.h. du musst mit "viel Schmerzen" vieles selber programmieren.
Lässt du dich auf das System ein, übernimmt die QT ne Menge arbeit fuer Dich.
Die Klassen mit denen QT ein MDI System aufbaut sind:
QMainWidget QMDIArea und QMDISubWindow(sollte die Basis deiner MDI Childs sein).
Ciao ...
Generell fuer MDI Anwendungen:
- Es sollte nur ein MDI Master Fenster geben ... Also 1 QMainWIndow
- Wie die ChildFenster dargestellt werden, bestimmt der Master (Manager)
- Ob Childs eigene Toolbars/Menues haben, oder ob das Menu /Toolbar des Masters Expandiert wird (mittlerweile standard in vielen systemen), entscheidet der der Style (Systemabhaengig).
....
Noch weiter z.b. gehen Gnome/Unity / Mac Anwendungen. da hat das Applikationsfenster nich mal ein menu, sondern das wird vom System dargestellt.
Wenn du Menu's/Toolbars in deine Widgets "hart" reinknallst, bekommst du zumindest Anwendungen, die irgendwie optisch nicht ins system passen, oder sogar Probleme ...
Weichst du von sowas ab, willst ne eigene "Lösung", kannst du das MDI system von QT nimmer verwenden! d.h. du musst mit "viel Schmerzen" vieles selber programmieren.
Lässt du dich auf das System ein, übernimmt die QT ne Menge arbeit fuer Dich.
Die Klassen mit denen QT ein MDI System aufbaut sind:
QMainWidget QMDIArea und QMDISubWindow(sollte die Basis deiner MDI Childs sein).
Ciao ...
-
Marcus Breuer
- Beiträge: 113
- Registriert: 31. März 2011 17:19
- Wohnort: Aachen
- Kontaktdaten:
Re: Mehrer Instanzen von QMainWindow als MDI sinnvoll?
Danke Euch beiden schonmal für die Antworten.
@dennisDennis: Zum Glück mache ich es dann nur aus Eigeninitiative:) bzw. für einen Freund, der mich gefragt hatte, ob ich ihm ein kleines Programm schreiben könnte, mit denen er Kontaktdaten verwalten kann. Das hat auch schon, dank u.a. der Hilfe hier im Forum geklappt. Jetzt geht es mir darum, dass das Layout auch gut aussieht und man evtl. in mehreren Fenstern gleichzeitig arbeiten kann, bzw. anzeigen lassen kann, etc.. Vielleicht hast Du Lust es hier drunter noch zu lesen.
@RHBaum: Ich werde mir die Klassen auf jeden Fall jetzt erstmal anschauen. Vielen dank für die Hinweise. Wollte allerdings noch etwas nachfragen. In dem Buch, das ich zum lernen verwende, funktioniert nämlich irgendwie immer alles so schön bzgl. Layouts. Und zwar ging es mir hauptsächlich um ein MDI Fenster, das ähnlich dem >>Adressbuch<< unter Mac OS aussieht.
Ich bin also so vorgegangen: Im Designer eine neues Widget anlegen. Zwei DockWidgets links anordnen. Beide enthalten ein ListWidget. Dann kann rechts erstmal noch irgendwas sein, worum ich mich später kümmern würde. Das funktioniert soweit auch alles. Allerdings gebe ich die Größen bei den DockWidgets bzw. dann auch bei den ListWidgets selber an, wobei ich da die jeweiligen Höhen etc. über die entsprechenden Funktionen zum Auslesen der Geometrie quasi variabel vorgebe. beim MainWindow wird es einfach in den dafür vorgesehen Bereich eingepasst. Ferner bleibt nach oben ein kleiner Rand zwischen DockWidget und Fensterrahmen, was auch nicht so prickelnd aussieht, ok, aber ein bisschen wie gewollt und nicht gekonnt, was vermutlich auch ganz beschreibend für meine "Arbeit" ist:)
Ich könnte natürlich auch ein paar Abstände manuell eintragen, ein paar Button rein und dann hätte ich quasi meine ToolBar. Das Beispiel, das ich in der Referenz gefunden hatte, benutzt auch leider nur MDI Fenster ohne ToolBar, bzw. da sitzt, wenn ich es richtig in Erinnerung habe nur ein TextEdit drauf und dann war es das schon.
Ich gebe Euch am besten mal ein Beispiel. Ich habe "Widget im Designer erstellt". Im Designer darauf zwei DockWidgets links eingefügt. Diese haben beide ein ListWidget als Inhalt. Im Konstruktor this->height() die Höhe des Widgets abgerufen. Da die DockWidgets ja links und über die gesamte Höhe im Widget bzw. ja dann im MDI Fenster angezeigt werden sollen, habe ich mit ui->meinDockWidget->setGeometry(0,0,this->height, minnimaleBreite), minimaleBreite habe ich vorher für das DockWidget mit setMinimumWidth(Bsp.Wert); die Position des ersten DockWidgets vorgegeben. Das funktioniert, allerdings sieht es dann so aus, als würde das DockWidget und das ListWidget über den Rand des Fensters hinausgezeichnet.
Ich habe was zu margins gelesen und werde da mal versuchen, irgendwie eine untere Grenze zu erwirken. Ansonsten bin ich aber auch sehr dankbar für weitere Tipps und Hinweise.
Viele Grüße,
Marcus
@dennisDennis: Zum Glück mache ich es dann nur aus Eigeninitiative:) bzw. für einen Freund, der mich gefragt hatte, ob ich ihm ein kleines Programm schreiben könnte, mit denen er Kontaktdaten verwalten kann. Das hat auch schon, dank u.a. der Hilfe hier im Forum geklappt. Jetzt geht es mir darum, dass das Layout auch gut aussieht und man evtl. in mehreren Fenstern gleichzeitig arbeiten kann, bzw. anzeigen lassen kann, etc.. Vielleicht hast Du Lust es hier drunter noch zu lesen.
@RHBaum: Ich werde mir die Klassen auf jeden Fall jetzt erstmal anschauen. Vielen dank für die Hinweise. Wollte allerdings noch etwas nachfragen. In dem Buch, das ich zum lernen verwende, funktioniert nämlich irgendwie immer alles so schön bzgl. Layouts. Und zwar ging es mir hauptsächlich um ein MDI Fenster, das ähnlich dem >>Adressbuch<< unter Mac OS aussieht.
Ich bin also so vorgegangen: Im Designer eine neues Widget anlegen. Zwei DockWidgets links anordnen. Beide enthalten ein ListWidget. Dann kann rechts erstmal noch irgendwas sein, worum ich mich später kümmern würde. Das funktioniert soweit auch alles. Allerdings gebe ich die Größen bei den DockWidgets bzw. dann auch bei den ListWidgets selber an, wobei ich da die jeweiligen Höhen etc. über die entsprechenden Funktionen zum Auslesen der Geometrie quasi variabel vorgebe. beim MainWindow wird es einfach in den dafür vorgesehen Bereich eingepasst. Ferner bleibt nach oben ein kleiner Rand zwischen DockWidget und Fensterrahmen, was auch nicht so prickelnd aussieht, ok, aber ein bisschen wie gewollt und nicht gekonnt, was vermutlich auch ganz beschreibend für meine "Arbeit" ist:)
Ich könnte natürlich auch ein paar Abstände manuell eintragen, ein paar Button rein und dann hätte ich quasi meine ToolBar. Das Beispiel, das ich in der Referenz gefunden hatte, benutzt auch leider nur MDI Fenster ohne ToolBar, bzw. da sitzt, wenn ich es richtig in Erinnerung habe nur ein TextEdit drauf und dann war es das schon.
Ich gebe Euch am besten mal ein Beispiel. Ich habe "Widget im Designer erstellt". Im Designer darauf zwei DockWidgets links eingefügt. Diese haben beide ein ListWidget als Inhalt. Im Konstruktor this->height() die Höhe des Widgets abgerufen. Da die DockWidgets ja links und über die gesamte Höhe im Widget bzw. ja dann im MDI Fenster angezeigt werden sollen, habe ich mit ui->meinDockWidget->setGeometry(0,0,this->height, minnimaleBreite), minimaleBreite habe ich vorher für das DockWidget mit setMinimumWidth(Bsp.Wert); die Position des ersten DockWidgets vorgegeben. Das funktioniert, allerdings sieht es dann so aus, als würde das DockWidget und das ListWidget über den Rand des Fensters hinausgezeichnet.
Ich habe was zu margins gelesen und werde da mal versuchen, irgendwie eine untere Grenze zu erwirken. Ansonsten bin ich aber auch sehr dankbar für weitere Tipps und Hinweise.
Viele Grüße,
Marcus