Este es un par de años demasiado tarde, pero yo estaba trabajando en un widget de superposición transparente que cubra por completo la matriz. No puede hacer lo que quiere sin crear subclases, pero puede restringir la creación de subclases a una instancia como lo sugiere @reclosedev, lo que significa que no tiene que crear realmente una subclase.
escribí el siguiente fragmento (que trabaja en PyQt4) para seguir el tamaño de cualquier widget que se añade el widget a:
class TransparentOverlay(QtGui.QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setAttribute(QtCore.Qt.WA_NoSystemBackground)
self._updateParent(self.parentWidget())
def setParent(self, parent, *args):
prevParent = self.parentWidget()
super().setParent(parent, *args)
self._updateParent(parent, prevParent)
def unsetParent(self, parent=None):
if parent is None:
parent = self.parentWidget()
if parent is not None and hasattr(parent.resizeEvent, '_original'):
parent.resizeEvent = parent.resizeEvent._original
def _updateParent(self, parent, prevParent=None):
if parent is not prevParent:
self.unsetParent(prevParent)
if parent is not None:
original = parent.resizeEvent
def resizeEventWrapper(event):
original(event)
self.resize(event.size())
resizeEventWrapper._original = original
parent.resizeEvent = resizeEventWrapper
self.resize(parent.size())
Este código utiliza un par de truquitos que son posibles con Python:
- El método original está guardado en el atributo
_original
del nuevo. Esto es posible porque las funciones son objetos.
- El nuevo método realmente subclasifica cualquier instancia de
QWidget
, lo que significa que no tiene que crear una subclase real. Cada instancia principal se convertirá efectivamente en una instancia de una subclase en virtud del método tachonado.
Si necesita algo de una sola vez, todo el código para eliminar el resizeEvent
método de subclase y su sustitución por el original puede ser destrozados. En ese caso, la solución es básicamente una versión más elegante de la solución de @reclosedev, pero con los comentarios de @ Chris sobre la preservación del original abordado.
La única advertencia con este código es que no admite los widgets GL correctamente, por lo que la superposición no siempre se puede agregar a la ventana de un QGraphicsView
. Sin embargo, se puede agregar al QGraphicsView
.
No, no se puede. La forma bset es: Crear su propio QWidget que emite redimensionada en resizeEvent(), luego promover sus widgets a ella :) –