2016-12-17 7 views
-1

QtQuick.Window ermöglicht es uns, das Fensterverhalten über die Eigenschaft "flags" mit Qt::WindowFlags zu definieren. Aus dem Qt docs:Nicht-Systemfenster in QML

Fensterfahnen sind eine Kombination eines Typs (zum Beispiel Qt :: Dialog) und null oder mehr Hinweise auf das Fenstersystem (zum Beispiel Qt :: FramelessWindowHint).

Wenn das Widget Qt :: Widget oder Qt :: SubWindow hatte und zu einem Fenster wird (Qt :: Window, Qt :: Dialog usw.), wird es auf dem Desktop auf Position (0, 0) gesetzt . Wenn das Widget ein Fenster ist und zu einem Qt :: Widget oder Qt :: SubWindow wird, wird es relativ zum übergeordneten Widget an die Position (0, 0) gesetzt.

Examples existieren von QML verwendet von Qt :: WindowFlags.

Leider alle verfügbaren Beispiele erstellen Systemfenster, dass in die Fenster in das System Window-Manager sichtbar sind. Die docs Behauptung, dass Nicht-System-Fenster kann auch mit der Qt::SubWindow Flag implementiert werden, aber ich konnte dies nicht erreichen. Hat jemand ein funktionierendes Beispiel in QML?

Siehe QMdiSubWindow Beispiele davon in C. Arbeits

+0

Sie wollen also grundsätzlich ein Pseudofenster in einem Systemfenster? – dtech

+0

Ja. Kann ich das von Grund auf in QML implementieren? Auch ja. Aber warum sollte die Zeit genutzt werden, wenn sie bereits unterstützt wird? Als ergänzende Anmerkung möchte ich auch, dass mir jemand zeigt, dass Qt :: SubWindow tatsächlich in QML funktioniert. – BrianTheLion

+0

Sie können auf [diese] (http://stackoverflow.com/questions/22682057/does-qt-qml-have-qmdiarea) Frage beziehen. Der einfachste Weg könnte darin bestehen, ein "falsches" inneres Fenster zu implementieren. – BaCaRoZzo

Antwort

0
import QtQuick 2.5 
import QtQuick.Window 2.2 

ApplicationWindow { 
    id: main 
    visible: true 
    width: 1280 
    height: 1024 

    Window { 
    visible: true 
    flags: Qt.SubWindow 
    } 
} 

Für mich ist das ein zweites Fenster erstellt, das immer keine obere Rand des Anwendungsfensters ist, ist nicht sichtbar, als reguläres Fenster in die Taskleiste Task-Schalter, und hat keine Schaltflächen minimieren, maximieren und schließen, aber es hat immer noch einen Rahmen und einen Namen. Es ist jedoch nicht auf den Bereich des Hauptfensters der Anwendung beschränkt, es kann sich außerhalb davon bewegen und es bewegt sich unabhängig vom Hauptfenster.

Wenn das das Verhalten ist, nach dem Sie suchen, dann sind Sie fertig. Wenn Sie möchten, dass es auf das Hauptfenster beschränkt ist und es zusammen mit ihm verschoben werden muss, implementieren Sie einfach eine einfache qml Item mit der notwendigen Dekoration und Schaltflächen, dann können Sie den Inhalt, den Sie wollen, darin einfügen.

+0

Können Sie die QtQuick-Version hinzufügen? Vielen Dank! – BrianTheLion

+0

@BrianTheLion - done – dtech

+0

Das scheitert für mich auf Ubuntu 16.04. Das Unterfenster ist weiterhin für den Fenstermanager sichtbar. – BrianTheLion

0

Ein QMdiSubWindow ist eigentlich kein Fenster, sondern ein Widget, das sich wie ein Fenster in einem speziellen Elternfenster verhält.

Ich nehme an, Sie verwenden QtQuick als die UI-Technologie mit QML, in diesem Fall können Sie dies einfach tun, indem Sie einen beliebigen Typ von Item als Kind des Stammelements und mit einem höheren Z-Wert als alle die anderen Kinder.

Eine übliche Technik, einen zu haben ist oder mehrere Overlay-Schichten

import QtQuick 2.0 

Item { 
    id: mainWindow 

    // main window content that should be below the sub windows 

    Item { 
     id: mdiArea 

     // any item in here is on top of any mainWindow contents 
     // individual stacking order can easily be controlled with each item's "z" property 
    } 

    Item { 
     id: popupArea 
     // any item in here is on top of everything in mdiArea 
    } 
} 

Statt Item für die MdiArea man in Erwägung ziehen könnte ein auch emtpy benutzerdefiniertes Element in C++ zu erstellen, aber die für ihre Kinder Positionsmanagement bietet, z.B "Kachel" oder "Stapel".

Eine solche Klasse könnte sogar einen schönen Beitrag zu Qt selbst leisten.