2010-11-25 34 views
8

Necesito crear un widget qt, que actuará como padre para algunos otros widgets, y que los ordenará.Un widget qt con fondo totalmente transparente

Ahora, la pregunta es ¿cómo puedo hacer que su fondo sea completamente transparente?

pensé que hacerlo de esta manera:

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

    QWidget *thisWidget; 
}; 

¿Cree que necesito para establecer el atributo, o va a trabajar bien sin él?

+0

lo que realmente necesita un fondo _transparent_, o es suficiente con tener _no_ fondo? Esta es una diferencia real: con un fondo transparente, el sistema operativo le dirá a la ventana _underlying_ que pintar los píxeles. Sin antecedentes, el sistema operativo solo espera que los niños pinten toda la ventana. – MSalters

+0

@MSalters Este widget se coloca en una ventana, y solo los widgets secundarios de estos widgets deberían estar visibles. Lo que está detrás de este widget (si no está cubierto por un widget hijo) debe ser visto. –

+0

No estoy seguro de entender esta pregunta ... de forma predeterminada en Qt4, un QWidget no dibujará nada por su propio fondo, y solo se dibujarán sus hijos. –

Respuesta

3

Por defecto en Qt4, un QWidget no dibujará nada para su propio fondo, y solo se dibujarán sus hijos. Si desea anular eso, debe decirle específicamente al widget que dibuje su fondo a través de una de sus propiedades. Tenga en cuenta que algunos widgets derivados de QWidget dibujarán fondos automáticamente.

+0

¿Qué sucede si solo quiero desarmar el fondo previamente configurado ('backgroundRole'). –

+0

@ TomášZato: la forma más fácil de consultar y recordar la configuración anterior, y usarla para restaurarla. Una de las maneras más difíciles sería consultar el widget para su padre, obtener el rol de fondo del padre y establecerlo en el widget. Todo esto es complicado si necesita dejar el resto de la paleta como está. –

2

Usted debe ser capaz de hacer todas las configuraciones de dibujo que necesita al cambiar el estilo de tu widget creo

MyWidget {background-color: none;}

debería funcionar, hojas de estilo pueden ser fácilmente probados en el diseñador

+0

Si lo hace en un QLineEdit, cambia el fondo de transparente a blanco (uso PyQt), incluso no deseado. Efecto divertido. Pero estoy de acuerdo en que usar qss es bastante cómodo la mayor parte del tiempo. – Trilarion

0

Es posible que desee ver:

setAttribute (Qt :: WA_NoSystemBackground, true);

y

setAttribute (Qt :: WA_OpaquePaintEvent, false);

0

La solución que funcionó para mí (yo estaba sentado un fondo transparente para un QTextEditor):

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