Widget Qt con fondo transparente

(Estoy usando PySide, pero creo que la respuesta sería la misma / similar para cualquier enlace de idioma).

Estoy tratando de tomar el ejemplo del reloj con forma, que se encuentra aquí , y hacer que la esfera del reloj (círculo) sea transparente, de modo que todo lo que veo son las manecillas del reloj y los tictac de los minutos. Como es, cuando el ejemplo se ejecuta, se ve así. Estoy usando Windows 7.

Hasta ahora, he intentado lo siguiente (en el constructor):

  • self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
    • Aparece el reloj (tiene presencia en la barra de tareas), pero no puedo verlo en ninguna parte
  • self.setAttribute(QtCore.Qt.WA_NoSystemBackground)
    • Aparece el reloj, pero tiene un fondo negro sólido.
  • self.setWindowOpacity(0.5)
    • Aparece el reloj, pero todo el reloj es transparente. Quiero que el fondo (cara) sea transparente, pero quiero que las manecillas del reloj sean visibles.

¡Lo tengo!

Esto es del código de ejemplo original (constructor):

  ... self.setWindowFlags(self.windowFlags() | QtCore.Qt.FramelessWindowHint) ... 

Aquí está la versión modificada (y funcionando según mi pregunta):

  ... self.setWindowFlags(QtCore.Qt.FramelessWindowHint) self.setAttribute(QtCore.Qt.WA_TranslucentBackground) ... 

La eliminación de self.windowFlags() fue la parte que faltaba. (No estoy exactamente seguro de por qué necesitaba eliminar esto o por qué estaba allí para comenzar … todavía hay mucho que aprender).

Si recuerdo correctamente, también debería haber configurado su hoja de estilo:

 self.setWindowFlags(QtCore.Qt.FramelessWindowHint) self.setAttribute(QtCore.Qt.WA_TranslucentBackground) self.setStyleSheet("background:transparent;") 

Espero que ayude.

en el ejemplo del reloj hay:

 void ShapedClock::resizeEvent(QResizeEvent * /* event */) { int side = qMin(width(), height()); QRegion maskedRegion(width() / 2 - side / 2, height() / 2 - side / 2, side, side, QRegion::Ellipse); setMask(maskedRegion); } 

el “setMask” hace la forma redonda
Pero hay lo mismo en PySide:

 def resizeEvent(self, event): side = min(self.width(), self.height()) maskedRegion = QtGui.QRegion(self.width()/2 - side/2, self.height()/2 - side/2, side, side, QtGui.QRegion.Ellipse) self.setMask(maskedRegion) 

¿Entonces debería funcionar también?