tutorial español documentacion creator qt qt4 pyqt pyqt4

español - qt creator python



QWidget cambiar el tamaño de la señal? (6)

En caso de que esté usando Python con PyQt4, puede configurar widget.resizeEvent a su función sin subclasificarlo:

#!/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_())

Quiero realizar una acción cuando se redimensiona un widget.

¿Hay alguna manera de detectar eso sin instalar un filtro de eventos en ese widget (y, obviamente, sin subclasificarlo)? AFAIK, QWidget no tiene una señal resized .


Esto es un par de años demasiado tarde, pero estaba trabajando en un widget de superposición transparente que cubriría completamente al padre. No puede hacer lo que quiere sin crear subclases, pero puede restringir las subclases a una instancia como sugiere @reclosedev, lo que significa que no tiene que crear una subclase.

Escribí el siguiente fragmento de código (que funciona en PyQt4) para seguir el tamaño de cualquier widget al que se agrega el widget:

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 trucos ingeniosos que son posibles con Python:

  • El método original está _original en el atributo original de la nueva. Esto es posible porque las funciones son objetos.
  • El nuevo método realmente QWidget subclases en cualquier instancia de QWidget , lo que significa que no es necesario crear una subclase real. Cada instancia principal se convertirá efectivamente en una instancia de una subclase en virtud del método abordado.

Si necesita algo de una sola vez, todo el código para eliminar el método resizeEvent subclasificado y reemplazarlo con el original puede ser eliminado. En ese caso, la solución es básicamente una versión más sofisticada de la solución de @ reclosedev, pero con los comentarios de @ Chris sobre la conservación del original abordado.

La única advertencia con este código es que no admite los widgets de GL correctamente, por lo que, por ejemplo, la superposición no siempre se puede agregar a la vista de un QGraphicsView . Sin embargo, se puede agregar a la propia QGraphicsView .


Lo siento, parece un hack, pero uso esto:

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


Puede anular el resizeEvent por

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


Puede derivar de la clase de widget y reimplementar el evento resizeEvent


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