2013-02-04 13 views
5

Ich weiß, wie man ein QWidget (in Qt4 oder Qt5)/QWindow (seit Qt5) randlos erstellt, eine benutzerdefinierte Titelleiste zeichnet und das Mausziehen manuell implementiert Verschieben Sie das Fenster auf dem Bildschirm, indem Sie einfach die Mausposition mit einigen mouseMoveEvent verfolgen und die Fensterposition aktualisieren.QWidget/QWindow Titelleiste: benutzerdefiniertes Aussehen, natives Feeling (ähnlich wie Chrome)

Diese Bewegung verhält sich jedoch anders als die native, wie vom Fenstermanager implementiert. Zum Beispiel kann das Fenster in der Nähe des Bildschirmrands als "Vollbild" oder "geteilter Bildschirm" interpretiert werden; oder Fenster werden abhängig vom System-/Fenstermanager an den Grenzen des jeweils anderen Fensters ausgerichtet. Diese Dinge funktionieren nicht, wenn Sie die Fensterbewegung wie oben implementieren.

Google Chrome/Chromium ist nur ein Beispiel für eine Anwendung, die eine benutzerdefinierte Fenstertitelleiste und einen Rahmen implementiert und sich gleichzeitig an das native Verhalten des Fenstermanagers anpasst. Ich frage mich, ob Chrome diese selbst implementiert (und den Window-Manager und seine Konfiguration erkennt) oder ob es in den meisten Window-Managern einige Funktionen gibt (klar, das ist immer noch stark plattformabhängig), um "native Window-Bewegung zu starten" und "stoppe native Fensterbewegung" oder ähnliches.

Ist so etwas in Qt möglich? Wenn nicht, vielleicht mit anderen Bibliotheken wie Qxt?

FYI: Ich bin hauptsächlich auf Windows und Linux ausgerichtet, wo ich sehe, die Schwierigkeit, die der Benutzer kann jeder Window Manager installiert haben.

+0

@ BЈовић (bearbeiten): Es ist nicht Qt5 spezifisch. Der Titel war irreführend. – leemes

+1

Könnte diese Frage für Ihr Problem relevant sein (zumindest unter Windows): http://stackoverflow.com/questions/11979278/wm-syscommand-sc-move-eats-up-mouse-events-and-mouse-up- ist-nicht-gefeuert –

+0

@Roku Ausgezeichnet, vielen Dank. Das sollte für Windows gut funktionieren, denke ich. Also immer noch auf der Suche nach einer Lösung, die unter Linux funktioniert. – leemes

Antwort

2

Basierend auf dem Versuch, das gleiche mit Qt4 vor kurzem, ich fürchte die Antwort ist, müssen Sie diese pro-Plattform/pro-Fenster-Manager tunen. Ich erwarte, dass Patches von QWindow das Verhalten in diesem Bereich verbessern würden, aber ich kenne keinen Standard-Hook, um dem OS/Window-Manager zu sagen, was Sie erreichen wollen.

Gleichermaßen sollte Qt 'nicht in die Quere kommen', dies zu lösen, es ist einfach ein Bereich, in dem es nichts tun kann, um Ihnen auf generische Weise zu helfen.