2017-01-17 3 views
0

machen Ich habe ein Problem, das QQuickWidget Hintergrund transparent.Kann QQuickWidget Hintergrund transparent ohne Unterbrechung Stapelreihenfolge

Ich möchte eine QQuickWidget unter einer QWidget platzieren. Das QQuickWidget verwendet eine Quell-qml-Datei. Als ich mit Qt 4.8 arbeitete, benutzte ich QDeclarativeView. Portierung von Qt 4 auf Qt 5, QDeclarativeView wird nicht mehr verwendet. Daher verwende ich QQuickWidget statt QDeclarativeView wie folgt:

QWidget *mainWidget = new QWidget(); 
mainWidget->setStyleSheet("background-image: url(:/background.png);"); 

QQuickWidget *quick = new QQuickWidget(mainWidget); 
quick->setAttribute(Qt::WA_TranslucentBackground, true); 
quick->setAttribute(Qt::WA_AlwaysStackOnTop, true); 
quick->setClearColor(Qt::transparent); 
quick->setSource(QUrl("qrc:/image.qml")); 

QWidget *topWidget = new QWidget(mainWidget); 
topWidget->setStyleSheet("background-image: url(:/semitransparent.png);"); 

Wenn ich tun:

setAttribute(Qt::WA_AlwaysStackOnTop, true); 

dann wird der Hintergrund transparent, aber bricht die Stapelreihenfolge der anderen Widgets unterhalb der QQuickWidget innerhalb Beteiligung das gleiche Fenster.

Ich möchte ein QQuickWidget transparent machen, wenn es unter einem QWidget ist. Ist das möglich? Wenn nicht, welche Workarounds schlagen Sie vor?

(1) Dies ist mainWidget des Hintergrundbild:

enter image description here

(2) Dies ist Hintergrund des QQuickWidget. qml Datei dieses Bild verwenden:

enter image description here

(3) Dies ist topWidget des Hintergrundbild:

enter image description here

(4) Was ich will:

enter image description here

(5) Was ich bekomme, wenn ich WA_AlwaysStackOnTop als falsch einstelle:

enter image description here

(6) Was ich bekomme, wenn ich WA_AlwaysStackOnTop als wahr gesetzt:

enter image description here

+0

Warum interessieren Sie sich, ob die QQuickWidget transparent ist oder nicht, da es an der Unterseite ist? Ist es nur teilweise sichtbar und Sie möchten sicherstellen, dass auch die teilweise sichtbaren Teile überhaupt nicht gesehen werden? – Sabuncu

+0

Ich habe Ihre Frage bearbeitet, aber bitte lesen Sie diesen Teil: "die anderen Widgets unter dem QQuickWidget im selben Fenster einbeziehen." Der ursprüngliche Satz hatte kein Verb ("fiil"), also extrapolierte ich die Bedeutung basierend auf dem Kontext. – Sabuncu

+0

Es würde helfen, einen Screenshot bereitzustellen, der das Problem zeigt, wenn 'WA_AlwaysStackOnTop' verwendet wird. Stellen Sie eine Verbindung zu einer imgur Bildschirmaufnahme her und ich werde es in den Körper der Frage einsetzen. – Sabuncu

Antwort

0

Offizielle QT Dokumentation hier http://doc.qt.io/qt-5/qquickwidget.html sagt, dass Bruch der Stapelreihenfolge sein erwartet:

Wenn dies absolut notwendig ist, kann diese Einschränkung überwunden werden, indem das Attribut Qt :: WA_AlwaysStackOnTop auf dem QQuickWidget auf gesetzt wird. Beachten Sie, jedoch, dass dies die Stapelreihenfolge bricht. Zum Beispiel ist es nicht möglich, andere Widgets oben auf dem QQuickWidget zu haben, so dass es sollte nur in Situationen, in denen eine semi-transparente QQuickWidget mit anderen Widgets darunter sichtbar ist erforderlich.

Auch diesen offiziellen Blog-Eintrag sehen: http://blog.qt.io/blog/2014/07/02/qt-weekly-16-qquickwidget/

Dieser aktuelle Blog-Eintrag für eine Funktion, die in QT ist neu 5.1: http://www.ics.com/blog/combining-qt-widgets-and-qml-qwidgetcreatewindowcontainer

Fazit: Was Sie sehen, ist kein Fehler, sondern eine bekannte, anerkannte, beworbene Einschränkung des QT-Frameworks.

Mein Rat: Versuchen Sie nicht, dies mit einem Hack zu lösen, sondern Ihre UI-Ansatz neu zu gestalten. Zum Beispiel können Sie vielleicht topWidget Alpha-Blend (halbtransparent) machen.

EDIT: Zum Beispiel wie folgt aus:

enter image description here

+0

Haben Sie das mit qt oder? ist es ein bearbeitetes Bild? –

+0

Es ist ein bearbeitetes Bild. – Sabuncu

Verwandte Themen