2012-01-21 15 views
18

Quiero realizar una acción cuando se cambia el tamaño de un widget.QWidget resize signal?

¿Hay una manera de coger que sin necesidad de instalar un filtro de eventos en ese widget (y, obviamente, sin la subclasificación de ella)? AFAIK, QWidget no tiene una señal resized.

+4

No, no se puede. La forma bset es: Crear su propio QWidget que emite redimensionada en resizeEvent(), luego promover sus widgets a ella :) –

Respuesta

11

Si tiene cualquier otra QObject que puede tener estricta relación con QWidget que puede usar QObject::installEventFilter(QObject * filter) y la sobrecarga bool eventFilter(QObject *, QEvent *). Ver más en Qt docs

17

Usted puede derivar de widget clase y reimplementar resizeEvent caso

+0

nota que escribió warwaruk "y, obviamente, sin la subclasificación que" –

+0

@KamilKlimek, ...después de haber publicado la respuesta :) – Lol4t0

+0

no se dio cuenta de que, mi mala –

9

En caso de que usted está utilizando Python con PyQt4, puede establecer widget.resizeEvent a su función sin sublclassing que:

#!/usr/bin/env python 
import sys 
from PyQt4 import QtCore, QtGui 

def onResize(event): 
    print event 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    widget = QtGui.QPushButton('Test') 
    widget.resizeEvent = onResize 
    widget.resize(640, 480) 
    widget.show() 
    sys.exit(app.exec_()) 
+5

Esto evita que la implementación de la clase base de resizeEvent se ejecute. Podría estar haciendo algo importante. Y con la solución de parche mono, tendrías que mantener una referencia al método original como una variable separada. Sucio. – Chris

+2

@Chris Los documentos dicen que cuando se llama a resizeEvent, el widget ya tiene su nueva geometría, por lo que si no tiene nada más que hacer en el widget principal, puede anular la función. Utilizo esta técnica para cambiar el tamaño del contenido de un QScrollArea. – blameless75

2

Lo sentimos, se ve como un truco, pero yo uso esto:

some_widget.resizeEvent = (lambda old_method: (lambda event: (self._on_resized(event), old_method(event))[-1]))(some_widget.resizeEvent) 
+2

Tanto para Python está diseñado para la legibilidad. Sin embargo, +1 para retener la súper implementación. –

2

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.

2

puede invalidar el resizeEvent por

def resizeEvent(self, newSize): 
    #do code here