2011-10-27 8 views
5

Tengo un widget personalizado para emular consejos de globos. Para visualizarse correctamente, el widget depende del atributo QWidget Qt::WA_TranslucentBackground. Mi aplicación debería funcionar en todas las plataformas principales (Windows XP, Windows 7, Linux, Mac), así que me preocupa un poco: ¿este atributo está disponible en todas las plataformas principales? Si no, ¿puedo consultar si es? testAttribute() no hace eso. Solo devuelve si el atributo se ha establecido, no si la configuración tiene un efecto.Qt :: WA_TranslucentBackground disponible en todas partes?

Respuesta

6

Esto debería funcionar con la única excepción de Linux sobre X11 cuando esto está configurado para no admitir ARGB. Consulte la documentación QWidget:

Creación translúcido de Windows

Desde Qt 4.5, ha sido posible crear ventanas translúcidas con regiones en sistemas de ventanas que apoyan la composición.

Para activar esta función en un widget de nivel superior, establezca su Qt :: WA_TranslucentBackground atributo con setAttribute() y garantizar que su fondo está pintado con colores no opacos en las regiones que desea ser parcialmente transparente .

notas sobre la plataforma:

X11: Esta función se basa en el uso de un servidor X que soporta visuales ARGB y un gestor de ventanas de composición.

Windows: El widget debe tener el indicador de ventana Qt :: FramelessWindowHint establecido para que la translucidez funcione.

Considere leer también el párrafo titulado "Transparencia y doble almacenamiento en búfer", podría ser interesante.

+0

¿Qué tan común o raro es que un Linux contemporáneo no admita ARGB? ¿Puedo de alguna manera consultarlo? –

+0

No creo que tenga problemas con hardware/distribuciones recientes. De todos modos, debe obtener información utilizando xdpyinfo o mirando el archivo de configuración xorg.conf. Es posible que tenga algunos problemas con los sistemas embebidos de Linux. Esto da algo más: http://stackoverflow.com/questions/2434511/what-pixel-format-does-x-server-use. –

7

Para Linux debe comprobar si la composición está habilitado:

bool QX11Info::isCompositingManagerRunning() [static] 

por ejemplo,

#ifdef Q_WS_X11 
    if(QX11Info::isCompositingManagerRunning()) 
     setAttribute(Qt::WA_TranslucentBackground); 
#endif 

Esta pregunta es antigua, pero podría ayudar a alguien.

+1

Y, para cualquiera que entre en Google, si necesita soportar escritorios no compilados para algo como un OSD redondeado o un globo emergente, el Qt [ShapedClock] (https://doc.qt.io/ qt-5/qtwidgets-widgets-shapedclock-example.html) ejemplo demuestra cómo usar 'setMask' para producir una ventana no cuadrada sin composición. – ssokolow

+0

Tenga en cuenta que a veces para que 'Qt :: WA_TranslucentBackground' funcione en Linux sin' setMask', también debe habilitar algunos atributos más y un indicador de ventana. https://stackoverflow.com/a/30596357/999943 – phyatt

Cuestiones relacionadas