Forum: PC-Programmierung Qt: Wie bekommt man ein DockWidget dazu, allen verfügbaren Platz zu nutzen?


von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Ich möchte in einer Qt-Anwendung Daten auf verschiedene Weise anzeigen
lassen.  Die Tabelle ist jetzt erstmal nur die einfachste Form, sie
soll dann noch durch Diagramme ergänzt werden (Qwt).

Ich möchte die einzelnen Darstellungsformen als DockWidget eintüten,
weil ich die Idee gut finde, dass der Nutzer sie dann wahlweise direkt
nebeneinander ("eingedockt"), oder aber als Tabs übereinander oder aber
auch als separate ("ausgedockte") Toplevel-Fenster anordnen kann, wie
es ihm gerade beliebt (und wie er Platz auf dem Bildschirm hat).

Was mir aber partout nicht gelingen will ist, dass das DockWidget den
verfügbaren Platz einfach von vornherein voll einnimmt, ohne dass der
Nutzer erst noch irgendwo irgendwas zurecht zupseln muss.  Es sieht
erstmal immer so aus wie auf dem ersten Bild, aber ich hätte es gern
so, wie auf dem zweiten (wo ich es manuell größer gezogen habe).

Ich habe schon alles mögliche mit SizeHints probiert, hat sich aber nie
was geändert.  Das Einzige, bei dem die Tabelle wirklich den verfügbaren
Platz einnimmt war, dass ich eine minimumHeight vorgegeben habe, die
ein wenig unter der Höhe des Elternfensters liegt.  Dann kann man aber
alles gar nicht mehr kleiner machen, was natürlich auch nicht im Sinne
des Erfinders liegt.

Hat jemand eine Idee, wie man das anstellen müsste?

von Jean Player (Gast)


Lesenswert?

Hi,
ich nehme an, du hast ein QmainWindow, wo das QDockWidget eingedockt 
wird.
Dann wäre setCentralWidget die richtige Methode.

Aufruf ais der QMainWidget
1
...
2
QDockWidget* dockWidget = new QDockWidget(...);
3
setCentralWidget(dockWidget);
4
...

Mfg Fabi

von Jean Player (Gast)


Lesenswert?

Hi nochmal,
es gibt noch andere Methoden, um das zu bewerkstelligen.
Aber dafür bräuchte ich mehr Details, von deinem Code und deinem 
Vorhaben.
Mit QLayout lässt sich auch arbeiten und und und ....

Mfg Fabi.
:-)

von Jean Player (Gast)


Lesenswert?

Herrje ^^
sry es heisst QMainWinow :-)
Bastele gerade schnell nen Beispiel und hänge gleich ran.

von Jean Player (Gast)


Angehängte Dateien:

Lesenswert?

Hiho,
so wie gesagt, hier nen Beispiel wie es funzt.
Mfg Fabi

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ja, ein QMainWindow sitzt natürlich obendrüber. ;-)

Danke schon mal, ich werde aber erst heute abend dazu kommen, mir
deinen Vorschlag anzusehen.  Tagsüber gibt's genügend andere Dinge zu
tun.

von Rolf Magnus (Gast)


Lesenswert?

Wenn ich dich richtig verstehe, ist QDockWidget dafür eher nicht 
gedacht. Die Idee dabei ist, ein Hauptfenster zu haben und dann mehrere 
Docks, die man irgendwo anhängen kann, als eine Art Seitenleisten, wie 
man es auf diesem Bild sieht:
http://qt-project.org/doc/qt-5.1/qtwidgets/images/mainwindow-docks-example.png
Du kannst also höchstens eine der Ansichten als Hauptansicht machen und 
die anderen als Docks irgendwo seitlich oder oben oder unten anheften.

von Mike M. (mikeii)


Lesenswert?

Den Parent kannst du nicht fragen wieviel Platz er hat? Oder kommen da 
noch mehr rein?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Jean Player schrieb:
> Aber dafür bräuchte ich mehr Details, von deinem Code und deinem
> Vorhaben.

OK, ich würde heute abend mal das existierende Projekt auf das
Notwendige zusammenstreichen.  Da ist jetzt noch einiges dabei, was
hier nicht von Belang ist.

Jean Player schrieb:
> so wie gesagt, hier nen Beispiel wie es funzt.

Danke auf jeden Fall!  Was mir dabei auffällt: es klappt nur "beim
ersten Mal".  Wenn man irgendwie an dem eingedockten Teil herumzieht,
sodass es auf eine andere Seite rutscht, dann verhält es sich wieder
so wie meins auch.  Noch seltsamer: wenn man die Tabelle über die kleine
Schaltfläche "schwimmen" lässt (also einen neuen Toplevel draus macht),
dann sollte sie sich eigentlich beim erneuten Klicken auf diese
Schaltfläche wieder zurück bewegen.  Das macht sie bei deinem Beispiel
gar nicht (sie reagiert einfach nicht), während das bei meinem jetzigen
Stand zumindest funktioniert.

Rolf Magnus schrieb:
> Wenn ich dich richtig verstehe, ist QDockWidget dafür eher nicht
> gedacht.

Das mag gut sein. :-)

> Die Idee dabei ist, ein Hauptfenster zu haben und dann mehrere
> Docks, die man irgendwo anhängen kann, als eine Art Seitenleisten, wie
> man es auf diesem Bild sieht

An sich ja, allerdings werden die anderen Seitenleisten bei mir nicht
gebraucht (alle Dockwidgets können als Qt::TopDockWidgetArea limitiert
werden).  Was aber insbesondere gegen diese Idee spricht, dass es gar
nicht gehen würde ist, dass man es ja immer manuell auf diese Größe
ziehen kann, und auch per minHeight.  Ich hätte es eben nur gern
automatisch als Default gleich so groß, wie es der Parent hergibt.

Mike Mike schrieb:
> Den Parent kannst du nicht fragen wieviel Platz er hat?

Kann sein, dass ich das kann, aber außer per minHeight (abgeleitet von
der Größe des Parents) habe ich das bislang noch nicht geschafft, damit
das eingedockte Dingsda kleiner zu bekommen.  Dann aber bekommt man den
Parent anschließend gar nicht mehr kleiner.

> Oder kommen da
> noch mehr rein?

Wenn, dann wäre es ausreichend, wenn die weiteren Widgets nebeneinander
liegen, d. h. die Höhe sollte trotzdem komplett das sein, was der Parent
so bietet.

Also wie geschrieben, ich werden heute abend mal was rausziehen, was
ich bislang als Code so habe, und was dann eigenständig die Intention
und das Problem verdeutlichen sollte.

von Jean Player (Gast)


Angehängte Dateien:

Lesenswert?

Hiho,
vll so jetzt wie Anhang ?
Nur das sich die 3 Dockwidgets noch den Platz nehmen, der übrig ist bei 
QMainWindow ?
Mfg Fabi

von Rolf Magnus (Gast)


Lesenswert?

Jörg Wunsch schrieb:
>> Die Idee dabei ist, ein Hauptfenster zu haben und dann mehrere
>> Docks, die man irgendwo anhängen kann, als eine Art Seitenleisten, wie
>> man es auf diesem Bild sieht
>
> An sich ja, allerdings werden die anderen Seitenleisten bei mir nicht
> gebraucht (alle Dockwidgets können als Qt::TopDockWidgetArea limitiert
> werden).

Naja, du hast dann unter dem TopDock immer noch das eigentliche 
Hauptfenster, also das CentralWidget. Das ist es, was ich meinte. Die 
Docks sind nicht dafür gedacht, das zentele Widget zu ersetzen, sondern 
nur als Anhängsel dafür. Deshalb werden sie auch nicht autmatisch den 
ganzen Platz nutzen.

von Jean Player (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Naja, du hast dann unter dem TopDock immer noch das eigentliche
> Hauptfenster, also das CentralWidget. Das ist es, was ich meinte. Die
> Docks sind nicht dafür gedacht, das zentele Widget zu ersetzen, sondern
> nur als Anhängsel dafür. Deshalb werden sie auch nicht autmatisch den
> ganzen Platz nutzen.

Jo, ich habe im angehangenden Code deshalb auch mal seine Tabelle als 
central gesetzt und 3 Dockwidgets rechts, wo er seine QWT sachen 
reinhängen kann.
Vielleicht genügt es ja so. Andernfalls, musst die QDockWidgets per 
überschriebendem resizeEvent anpassen vermute ich mal ausm Bauch.
Mfg

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

OK, hier mal mein minimiertes Beispiel.

Eigentlich kommen die Daten entweder aus einer Datei oder "live" vom
Analyzer, ich habe sie der Einfachheit halber mal statisch dazu
gepappt.

Die zweite Darstellungsform als Diagramm ist auch erstmal nur sehr
lieblos dahin geklatscht.  Die muss natürlich noch farblich gestaltet
werden, eine ordentliche Achsenbeschriftung bekommen etc. pp.  Neben
diesem Diagramm soll es dann noch mehrere weitere geben, mit denen
die Daten verschieden dem Nutzer interpretiert werden können.  Es
soll dem Nutzer freigestellt werden, welche der Darstellungsformen
er gerade sehen möchte.

Was ich im Moment (als Default) bekomme, ist "shot1.png".

Was ich gern hätte, ist "shot2.png" bzw. (auf Wahl des Nutzers, geht
einfach durch Drüberziehen des Qwt-Plots über die Tabelle) "shot3.png".

Es muss natürlich nicht unbedingt ein DockWidget sein, aber interessant
sind die folgenden Features dabei:

. die Inhalts-Elemente können wahlweise "schwimmend" angeodnet werden
(also separate Toplevels werden)
. wahlweise Tab-Darstellung oder nebeneinander liegend

Diese beiden Sachen werden halt durch das DockWidget (plus die
DockWidgetAreas) schon ganz gut realisiert.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Jean Player schrieb:
> vll so jetzt wie Anhang ?

Nee, leider auch noch nicht so ganz.

Siehe vorherigen Beitrag, vielleicht wird ja mein Ansinnen jetzt klarer?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Jörg Wunsch schrieb:
> OK, hier mal mein minimiertes Beispiel.

p.s.:
1
c->setRawSamples(ds->freq, ds->r, DS::nDataPoints);

Das ist Qwt5-Syntax.
1
c->setRawSamples(ds->freq, ds->r, DS::nDataPoints);

heißt es für Qwt6.

von Rolf Magnus (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> c->setRawSamples(ds->freq, ds->r, DS::nDataPoints);
>
> Das ist Qwt5-Syntax.
> c->setRawSamples(ds->freq, ds->r, DS::nDataPoints);
>
> heißt es für Qwt6.

Auch nach sehr intensivem Anstarren erschließt sich mir der Unterschied 
nicht.

Jörg Wunsch schrieb:
> Es muss natürlich nicht unbedingt ein DockWidget sein, aber interessant
> sind die folgenden Features dabei:
>
> . die Inhalts-Elemente können wahlweise "schwimmend" angeodnet werden
> (also separate Toplevels werden)
> . wahlweise Tab-Darstellung oder nebeneinander liegend

Es gibt zwar noch QMdiArea, das eher dafür gedacht ist, mehrere 
Haupt-Ansichten zu haben, aber da kann man nur für alle Fenster 
gemeinsam wählen, ob sie als Einzelfenster (dann ganz frei 
umherschiebbar) innerhalb der Area oder als Tabs dort sein sollen. 
Toplevel geht da meines Wissens aber gar nicht.

> Diese beiden Sachen werden halt durch das DockWidget (plus die
> DockWidgetAreas) schon ganz gut realisiert.

Ja. Du mußt dann halt damit leben, daß die immer um ein CentralWidget 
herum angeordnet sein müssen, oder du mußt selbst Hand anlegen und das 
irgendwie ändern. Ob das so einfach ist, weiß ich aber nicht. Ich hab 
mal versuchsweise im Designer ein QDockWidget in ein einfaches QWidget 
reingebaut statt in ein QMainWindow. Das geht zwar, aber es scheinen 
dann einige Funktionalitäten zu fehlen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Rolf Magnus schrieb:
> Jörg Wunsch schrieb:
>> c->setRawSamples(ds->freq, ds->r, DS::nDataPoints);
>>
>> Das ist Qwt5-Syntax.
>> c->setRawSamples(ds->freq, ds->r, DS::nDataPoints);
>>
>> heißt es für Qwt6.
>
> Auch nach sehr intensivem Anstarren erschließt sich mir der Unterschied
> nicht.

Ah cr*p.

Hieß mal setRawData(), heißt jetzt setRawSamples().

Danke für deine Kommentare.  Mal sehen, wie ich aus dem Dilemma
herauskomme.  Eigentlich gefällt mir die Idee mit den "eindockbaren"
Widgets ja, aber andererseits sollten sie natürlich nicht so tun, als
müssten sie noch Platz lassen für allerlei potenziellen weiteren Kram,
der da gar nicht existiert.

Zur Not könnte ich auch damit leben, zwischen "Alle Widgets als Tabs"
und "Alle Widgets als Toplevels" umzuschalten.  Aber eigentlich finde
ich die freie Wahl durch den Nutzer schon schick.

von Jean Player (Gast)


Angehängte Dateien:

Lesenswert?

Huhu und guten Morgen.
Ich hoffe das es den Ansprüchen genügt und ich es endlich verstanden 
habe, was der werte Herr möchte ^^ (SPASS) :-)

Mfg Fabi

von Jean Player (Gast)


Lesenswert?

Rolf Magnus schrieb:
>> Diese beiden Sachen werden halt durch das DockWidget (plus die
>> DockWidgetAreas) schon ganz gut realisiert.
>
> Ja. Du mußt dann halt damit leben, daß die immer um ein CentralWidget
> herum angeordnet sein müssen, oder du mußt selbst Hand anlegen und das
> irgendwie ändern. Ob das so einfach ist, weiß ich aber nicht.

Haja dachte i au erst, vorm schlafen gehen. Aber siehe oben, wie 
poppelig das war :-)
Ich glaube ich träume schon bald in Qt ......

von Rolf Magnus (Gast)


Lesenswert?

Ja, das sieht doch sehr gut aus. Hätt ich nicht gedacht. Wo steckt denn 
nun die Magie? In dieser unscheinbaren Zeile?
1
    setWindowState(windowState() ^ Qt::WindowMaximized);

von Jean Player (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Ja, das sieht doch sehr gut aus. Hätt ich nicht gedacht. Wo steckt denn
> nun die Magie? In dieser unscheinbaren Zeile?
> setWindowState(windowState() ^ Qt::WindowMaximized);

Jip^^.
Ich habe es wie ein normales QWidget behandelt.
Und siehe da ES gehorcht ^^.
Mfg Fabi

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Jean Player schrieb:
> Ich glaube ich träume schon bald in Qt …

:-)

Ein dickes Dankeschön erstmal!

Ich habe das Prinzip mal in mein Projekt eingebaut.  Ich würde sagen:
almost there.  Irgendwie sträubt es sich noch ein wenig, noch weiter
als das zu wachsen (und lässt sich auch nicht unter dieses Maß dann
verkleinern, aber das könnte erstmal OK sein).

Den Platz drunter kann ich ggf. sowieso noch für ein paar "Knöpfchen"
benutzen (um im Diagramm markers zu bewegen).

Da das Ganze am Ende ein Opensource-Projekt werden soll, würde ich, so
du magst, gern deinen Namen als Dankeschön im Header veröffentlichen,
Fabian.  Da müsstest du mir nur mal schreiben (private Mail genügt),
was ich genau hinschreiben soll.

von Jean P. (fubu1000)


Lesenswert?

Hi Jörg,
kein Problem, freut mich wenn ich mit meinem bescheidenem Wissen auch 
mal helfen konnte :-)
Aso, Email ist raus.

Mfg Fabi

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Eventuell geht auch ein 1x1 px center-widget?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Läubi .. schrieb:
> Eventuell geht auch ein 1x1 px center-widget?

Das hat leider nichts geändert.

Jörg Wunsch schrieb:
> Ich würde sagen: almost there.

Das, was sich bei mir anders benimmt als im obigen Qdock.zip, liegt
offenbar irgendwie am QMainWindow als Mutterklasse.  Wenn ich (wie
Fabian) ein QWidget direkt beerbe, sieht alles schön aus, allerdings
funktionieren dann natürlich die Menüs und Statuszeile nicht mehr so,
wie geplant.

Ich denke, ich werden den Rest mit Fabian mal offline weiterarbeiten,
der Weg scheint ja so einigermaßen klar nun.

Danke jedenfalls für die rege Beteiligung!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.