2010-11-25 14 views
8

Ich brauche ein qt-Widget zu erstellen, die als Eltern für einige andere Widgets fungieren wird, und das wird sie bestellen.A qt-Widget mit vollständig transparenten Hintergrund

Jetzt ist die Frage, wie mache ich es Hintergrund völlig transparent?

dachte ich, es so zu tun:

struct Imp 
{ 
    Imp(QWidget *parent) : thisWidget(new QWidget(parent)) 
    { 
    thisWidget->setAttribute(Qt::WA_TranslucentBackground, true); 
    } 

    QWidget *thisWidget; 
}; 

Glauben Sie, dass ich das Attribut festlegen müssen, oder wird es ohne es in Ordnung geht zu arbeiten?

+0

Brauchen Sie wirklich einen _transparent_ Hintergrund, oder ist es ausreichend, _no_ Hintergrund zu haben? Dies ist ein echter Unterschied: Mit einem transparenten Hintergrund teilt das Betriebssystem dem _unterlegenen_ Fenster mit, die Pixel zu malen. Ohne Hintergrund erwartet das Betriebssystem nur, dass die Kinder das gesamte Fenster malen. – MSalters

+0

@MSalters Dieses Widget befindet sich in einem Fenster und nur die untergeordneten Widgets dieser Widgets sollten sichtbar sein. Was auch immer hinter diesem Widget (wenn nicht von einem Kind-Widget abgedeckt) ist, sollte gesehen werden. –

+0

Ich bin mir nicht sicher, ob ich diese Frage verstehe ... standardmäßig wird in Qt4 ein QWidget nichts für seinen eigenen Hintergrund zeichnen und nur seine Kinder werden gezeichnet. –

Antwort

3

In Qt4 zeichnet ein QWidget standardmäßig nichts für seinen eigenen Hintergrund, und nur seine Kinder werden gezeichnet. Wenn Sie dies überschreiben möchten, müssen Sie dem Widget speziell mitteilen, dass es seinen Hintergrund über eine seiner Eigenschaften zeichnen soll. Beachten Sie, dass einige von QWidget abgeleitete Widgets automatisch Hintergründe zeichnen.

+0

Was ist, wenn ich nur den zuvor festgelegten Hintergrund ('backgroundRole') zurücksetzen möchte. –

+0

@ TomášZato: Der einfachste Weg, um die vorherige Einstellung abzufragen und zu merken, und diese zu benutzen, um sie wiederherzustellen. Eine der schwierigeren Methoden wäre, das Widget nach dem übergeordneten Element abzufragen, die Hintergrundrolle des übergeordneten Elements zu ermitteln und diese auf dem Widget festzulegen. All dies ist kompliziert, wenn Sie den Rest der Palette so lassen müssen, wie sie ist. –

2

Sie sollten in der Lage sein, alle die Zeichnung Anpassung zu tun, müssen Sie durch den Stil Ihres Widgets zu ändern Ich denke,

MyWidget {background-color: none;}

funktionieren sollte, kann Sheets sehr leicht im Designer getestet werden

+0

Wenn Sie dies auf einem QLineEdit tun, ändert sich der Hintergrund von transparent zu weiß (ich benutze PyQt), sogar unerwünscht. Lustiger Effekt. Aber ich stimme zu, dass die Verwendung von qss die meiste Zeit angenehm ist. – Trilarion

0

Sie können wollen, betrachten:

setAttribute (Qt :: WA_NoSystemBackground, true);

und

setAttribute (Qt :: WA_OpaquePaintEvent, false);

0

Die Lösung, die für mich gearbeitet (ich war einen transparenten Hintergrund für eine QTextEditor Einstellung):

auto editorPalette = editorWidget->palette(); 
editorPalette.setColor(QPalette::Active, QPalette::Base, Qt::transparent); 
editorPalette.setColor(QPalette::Inactive, QPalette::Base, Qt::transparent); 
editorWidget->setPalette(editorPalette); 
Verwandte Themen