Setzen Sie transparentes QWidget auf QMediaView in QT5 auf Ubuntu

8

Ziel

Ich möchte, dass der Hintergrund meiner QT5-basierten GUI eine Videodatei ist, die abgespielt wird. Ich möchte auch in der Lage sein, meine GUI-Komponenten mit Transparenz zu gestalten, damit das Video durch sie zeigt.

Ich bin mir nicht sicher, ob dies überhaupt möglich ist. Es könnte sein, dass ich gerade einen wichtigen Hinweis verpasst habe (ich bin immerhin ein Qt-Anfänger), oder es könnte sein, dass es einfach nicht funktionieren sollte. Aber Optimist zu sein, habe ich mein Bestes gegeben.

Erster Versuch

Mein minimaler erster Versuch sah so aus:

%Vor%

Die Schaltfläche befindet sich oben auf dem Video, was gut ist. Aber wenn Sie genau hinsehen, werden Sie einige schwarze Pixel in den Ecken der Schaltfläche sehen, die anzeigen, dass es nicht transparent über das Video ist, aber als undurchsichtiges Rechteck dargestellt wird.

Zweiter Versuch

Ich habe versucht, die Schaltfläche mit background:transparent; zu formatieren (siehe die kommentierte Zeile im obigen Code). Dadurch wurde der Hintergrund der Schaltfläche transparent, aber die schwarze Box hinter der Schaltfläche ist jetzt noch deutlicher.

Andere Versuche

Ich habe mehrere Tipps aus verschiedenen Quellen online gelesen, wie man das macht. Keiner hat für mich gearbeitet. Ich habe versucht, mit QGraphicsScene und Freunden, verschiedenen Layoutstapeln, verschiedenen Attributen der fraglichen Widgets und vielem mehr zu arbeiten. Mein letzter Versuch war, das übergeordnete Element von QVideoWidget auf eine Instanz von QGLWidget () zu setzen, in der Hoffnung, dass die erzwungene Hardwarebeschleunigung meine Probleme lösen würde (mein Computer verfügt über Hardware-3d-Beschleunigung mit Binärtreiber). Dadurch wurde das Fenster überhaupt nicht mehr angezeigt, während ich den Soundtrack des im Hintergrund wiedergegebenen Videos immer noch hören konnte, was darauf hinwies, dass die Anwendung noch lief.

Anfrage

Ich hoffe wirklich, dass es einige gutherzige und kluge QT5-Entwickler gibt, die mir helfen können, meinen Traum zu erfüllen, Widgets auf einem spielenden Video in QT5 auf Ubuntu zu platzieren.

Danke!

    
Lennart Rolland 03.06.2013, 02:32
quelle

3 Antworten

6

Ich weiß, dass dies eine alte Frage ist, und Sie haben Ihr Problem gelöst, indem Sie Teile Ihrer Anwendung in QML / QtQuick 2.2 umgewandelt haben, aber ich stolperte durch die Google-Suche und jemand mit demselben Problem könnte dies auch finden. Ich habe eine Lösung gefunden, die für mich funktioniert und mit QT 5.3 unter Windows getestet wurde.

Ich habe eine QGraphicsView verwendet, um das Video anzuzeigen. Hier ist mein Code (playerScreen ist die QGraphicsView):

%Vor%

Ich habe die Bildlaufleisten auf playerScreen deaktiviert, da sonst horizontale und vertikale Bildlaufleisten vorhanden wären.

Ich habe ein QWidget auf dem PlayerScreen, in dem ich mit QPainter zeichne. Das QWidget befindet sich oben in der Grafikansicht.

Wenn ich dann das Video abspiele, rufe ich ui->playerScreen-show() an. Ich mache das nur beim Spielen, weil ich einen anderen Bildschirm oben habe (für ein anderes mit meinem Projekt verbundenes Zeug) und ich muss show / hide aufrufen, wenn das Video benutzt / nicht benutzt wird:)

Lassen Sie es mich wissen, wenn Sie weitere Informationen zu meinem Code benötigen.

    
Solidus 23.12.2014 17:42
quelle
2

Haftungsausschluss: Ich habe diese Lösung nicht ausprobiert. Es funktioniert auf Qt 4.8, um transparente Widgets über alles zu setzen, was OpenGL gerendert wird. Ich nehme nur an, dass das Media Play Hardwarebeschleunigung verwendet.

Die schwarzen Pixel sind Qt's Backbuffer, wo Software Rendering durchgeführt wird. Das Video umgeht diesen Backbuffer, und wenn ein "normales" qt-Widget gezeichnet wird, wird es auf den Backbuffer gezeichnet, der sich noch im Ausgangszustand (schwarz) befindet.

Sie könnten die Schaltfläche (oder ein Widget mit der Schaltfläche) in ein separates, transparentes Fenster umwandeln.

%Vor%

Sie müssten es jedoch manuell positionieren, damit es Ihrem Fenster folgt. Dies bedeutet, dass die Schaltfläche ein Eventfilter im Fenster installieren muss und alle Bewegungen oder Größenänderungen von Ereignissen abhören muss. Es berechnet dann seine eigene Position relativ zum Fenster neu und aktualisiert seine Position.

    
Bgie 29.04.2014 08:31
quelle
-4

qwidget4.1

void setAutoFillBackground (bool aktiviert) // Sie haben diese Methode, versuchen Sie es.

Suche immer vorher im Forum, denn es gibt viele Antworten. :) Nicht dass ich etwas dagegen habe, es ist schneller für dich.

​​Ein qt-Widget mit vollständig transparentem Hintergrund

    
adderly 11.06.2013 20:02
quelle

Tags und Links