Maximieren [gelöst]

Alles rund um die Programmierung mit Qt
Ginsengelf
Beiträge: 79
Registriert: 2. Mai 2007 10:21

Beitrag von Ginsengelf »

Moin, prüf doch einfach, ob die neue Größe gleich der Bildschirmgröße ist, und mach dann irgendwas.

Ginsengelf
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Die Bildschirmgröße entspricht in den seltensten Fällen der Größe die mit dem Maximieren-Button erreicht wird.

Außerdem ist die Frage, doch eher, was du wirklich erreichen willst. Willst du nicht vielleicht eine feste Größe fürs Fenster vorgeben?
Label
Beiträge: 55
Registriert: 15. August 2008 10:03

Beitrag von Label »

Nein eigentlich habe ich ein Fenster, in dem eine Matrix dargestellt wird. Dieses Fenster kann vom User maximal auf die Größe dieser Matrix vergrößert werden.

Mein Problem ist, das es beim Maximieren über den besagten Knopf auf die Größe des Monitors vergrößert wird und somit meine Matrix oben links in der Ecke ist und rechts und unter der Matrix hässliche, dicke, graue Ränder entstehen.

Mein erster Anstatz war den Maximieren-Button zu entfernen, damit einfach nicht maximiert werden kann. Da das nicht funktioniert, möchte ich irgendwie das Maximieren abfangen, am besten schon bevor mein Fenster maximiert wurde (also vor dem resizeEvent() ), um das Fenster auf die maximale Größe der Matrix zu vergrößern.
Ginsengelf
Beiträge: 79
Registriert: 2. Mai 2007 10:21

Beitrag von Ginsengelf »

Dann reimplementiere den ResizeEvent doch so, dass bei Überschreiten der Matrixgröße das Fenster auf Matrixgröße gesetzt wird (auf den zweiten Blick führt das zu endloser Rekursion...)

Ginsengelf
Label
Beiträge: 55
Registriert: 15. August 2008 10:03

Beitrag von Label »

Mir ist da gerade etwas anderes in den Kopf gekommen.
Ich werde folgendes ausprobieren:

Code: Alles auswählen

MyWidget::resizeEvent(QResizeEvent *event)
{
    if(isMaximized())
        showNormal();
}
könnte sein das das die Lösung meiner Probleme ist, aber im Augenblick kann ich es nicht testen weil ich äußerst mysteriöse Fehler ausgespuckt bekomme. Die haben aber nicht mit diesem Problem zu tun.

Ich melde mich wieder sobald ich es getestet habe.
Label
Beiträge: 55
Registriert: 15. August 2008 10:03

Beitrag von Label »

Ich habe es getestet und naja, es funktioniert.Es ist zwar nicht die eleganteste Lösung weil sich das Fenster erst kurz maximiert und danach wieder auf die Ursprungsgröße zurück springt aber es funktioniert.

Es muss doch aber trotzdem eine Möglichkeit geben, das Maximieren abzufangen und zu verhindern BEVOR es ausgeführt wird. Das resizeEvent wird auf jeden Fall erst nach dem Maximieren aufgerufen.

Ich bin für weitere Ideen, Hinweise, Vorschläge usw. offen.
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

Und bei setMaximumSize() kann man trotzdem noch maximieren?
Label
Beiträge: 55
Registriert: 15. August 2008 10:03

Beitrag von Label »

Ja kann man.
Ich habe in meinem Programm setMaximumSize() benutzt um es dem User nicht zu ermöglichen, das Fenster größer zu machen als die Matrix ist. Das funktioniert auch. Man kann das Fenster nicht größer ziehen, aber man kann es maximieren. Ist zwar nicht schön, aber es geht ... leider.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

ich versteh das warum noch ned ganz ...

jeder windows manager hat doch seine philosophie, und meistens sind die gar ned so verschieden.

Und irgendwo muss man festlegungen machen, an die sich alle halten, sonst programmiert man ins nirvana.

Bei den fenstermanagern iss es meist so ... entweder der user kann die groesse selber bestimmen, mit alles konsequenzen. Also kann er das Hauptfenster auch maximal so gross wie den desktop ziehen ... oder eben ne bestimmte minimalgroesse ....
das es keine maximalgroesse gibt, ist ne designentscheidung, da es bei fenstern mit maximalgroesse theorethisch keinen maximize button geben duerfte.

oder der user darf die groesse des fensters gar ned aendern (dialog box style), mit allen konsequenzen ...

Zu versuchen diese "systemvereinbarungen" programmiertechnisch zu umgehen, wird frueher oder spaeter immer auf konflikte stossen.

Wenn Du Software fuer nen groesseren Kundenbereich programmierst, mit den üblichen Qualitaetssicherungsmechanismen, wuerdest dich bei Deiner Loesung ueber staendige Eintrage ala "unerwartetes verhalten" freuen ... weil die haelfte User wuerden sich vera.... fuehlen, wenn sie auf nen max button klicken, oder nen fenster mit der Maus aufziehen, und die SW ueberschreibt diese Entscheidung.

Also programmier lieber konsequent.

entweder mach nen Fenster mit fester groesse ....

oder mach das fenster voll resize-faehig, mit der konsequenz das es ned toll aussieht. Aber vielleicht kannst da noch bissi dran feilen ... und biete nen alternativen button an, wo den user ne optimale Fenstergroesse einstellen kannst ....

btw gibt es fuer die meisten Systeme Styleguides, da steht sowas eigentlich auch drin.

Ciao ...
Label
Beiträge: 55
Registriert: 15. August 2008 10:03

Beitrag von Label »

Eben das ist das Problem. Das Programm ist nicht für einen großen Kundenkreis sondern nur für einen einzigen. Der hat aber auch ziemlich genaue Vorstellungen davon wie das am Ende auszusehen hat.
Und er möchte das man die Größe ändern kann, aber eben nur maximal so groß wie die Matrix ist. Was das ganze erschwert ist, dass diese Matrix nicht immer die selbe Größe hat sondern je nachdem mit welchen Parametern das Programm gestartet wird unterschiedlich groß ist.

Und da stellt sich mir die Frage:
Wenn ich dem User entweder die Größe des Fenster ändern lassen können soll oder eben gar nichts an der Größe ändern lassen können soll, warum gibt es dann den Befehl setMinimumSize() und setMaximumSize() ?

(Ich hasse Sätze mit mehr als 2 Verben) :wink:
Label
Beiträge: 55
Registriert: 15. August 2008 10:03

Beitrag von Label »

Ich hab mein Fenster jetzt von QDialog erben lassen. Jetzt kann ich es zwar nich mehr minimieren aber ok, ich denke darüber kommt der Kunde schon hinweg.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

die beiden funktionen sind fuer die widgets allgemein ....
und innerhalb eines layouts haben die schon ihre Daseinsberechtigung.

Normal sollt nen fenster ganz oben in der fensterhirarchie ja eigentlich nur vom typ QMainwindow, oder QDialog sein.

Die QT wird dir aber auch ned alle möglichkeiten des Systems ausschoepfen, und die Qt hat teilweisse auch Ihre eigene philosophie. Das heisst die macht auch viele annahmen fuer Dich. Dann ists oefters auch so, dass wenn die sachen aushebeln musst, du am ende auf mehr Probleme stoesst als wie die lib Dir dann hilfe bringt.
Aber dass musst selbst abschaetzen ....

BTW, was fuern window manager verwendet ihr unter eurem Linux, ned das der scho aerger macht. Das ein und ausblenden von den System-Buttons ist ja seine Aufgabe .

uebrigens gibts fuer das aendern des Status nen eigenen eventtyp
QEvent::WindowStateChange
das resize abfangen selber bringt dir nix, weil das nur das nachfolgende event ist ....

wenn das statechange abfaengst, koenntest auf sowas reagieren

Ciao ...
Label
Beiträge: 55
Registriert: 15. August 2008 10:03

Beitrag von Label »

Genau das habe ich die ganze Zeit gesucht ... ein Event mit dem ich das Maximieren abfangen kann ... QEvent::WindowStateChange ... die Lösung meiner Probleme.

Naja aber du hast schon recht, es ist schon sehr merkwürdig wenn man als Kunde auf den Maximieren-Knopf drückt und nichts passiert bzw. nicht das was man sich eigentlich darunter vorstellt. Von daher werde ich es so lassen wie es jetzt ist, also als QDialog.

Viele Dank nochmal für die aufschlussreichen Diskussionen :)
Antworten