Maximieren [gelöst]
-
Ginsengelf
- Beiträge: 79
- Registriert: 2. Mai 2007 10:21
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.
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
Mir ist da gerade etwas anderes in den Kopf gekommen.
Ich werde folgendes ausprobieren:
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.
Ich werde folgendes ausprobieren:
Code: Alles auswählen
MyWidget::resizeEvent(QResizeEvent *event)
{
if(isMaximized())
showNormal();
}Ich melde mich wieder sobald ich es getestet habe.
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.
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.
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 ...
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 ...
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() ?
ch hasse Sätze mit mehr als 2 Verben) 
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() ?
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 ...
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 ...
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
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