QWidget redimensionner le signal?

je veux prendre une décision quand un widget a été redimensionné.

y a-t-il un moyen d'attraper cela sans installer un filtre d'événement sur ce widget (et, évidemment, sans le sous-classer)? Autant que je sache, QWidget ne dispose pas d'un resized signal.

20
demandé sur Johu 2012-01-21 23:01:47

6 réponses

si vous avez tout autre QObject qui peut avoir une relation stricte avec QWidget, vous pouvez utiliser QObject::installEventFilter(QObject * filter) et la surcharge de bool eventFilter(QObject *, QEvent *). Voir plus d' QT docs

10
répondu Kamil Klimek 2016-09-20 19:44:06

Vous pouvez tirer d' widget classe et réimplémenter resizeEvent événement

17
répondu Lol4t0 2012-01-21 19:19:45

si vous utilisez Python avec PyQt4, vous pouvez définir widget.resizeEvent à votre fonction sans sublclassing:

#!/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_())
9
répondu reclosedev 2012-01-28 10:38:42

Désolé, il ressemble à un hack, mais j'utilise ceci:

    some_widget.resizeEvent = (lambda old_method: (lambda event: (self._on_resized(event), old_method(event))[-1]))(some_widget.resizeEvent)
3
répondu Vladyslav Savchenko 2016-01-15 00:29:59

c'est quelques années trop tard, mais je travaillais sur un widget transparent de superposition qui couvrirait complètement le parent. Vous ne pouvez pas faire ce que vous voulez sans sous-classe, mais vous pouvez restreindre la sous-classe à une instance comme @reclosedev le suggère, ce qui signifie que vous n'avez pas à créer une sous-classe.

j'ai écrit l'extrait suivant (qui fonctionne dans PyQt4) pour suivre la taille de tout widget auquel le widget est ajouté:

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())

ce code utilise quelques astuces qui sont possibles avec Python:

  • La méthode originale est planqué dans le _original attribut du nouveau. Ceci est possible parce que les fonctions sont des objets.
  • la nouvelle méthode sous-classe vraiment tout QWidget exemple, ce qui signifie que vous n'avez pas à créer un véritable sous-classe. Chaque instance mère deviendra effectivement une instance d'une sous-classe en vertu de la méthode tacked on.

Si vous avez besoin d'un une fois chose, tout le code pour enlever le sous-classé resizeEvent méthode et de la remplacer par l'original peut être saccagé. Dans ce cas, la solution est essentiellement une version plus fantaisiste de la solution de @reclosedev, mais avec les commentaires de @Chris sur la préservation de l'original adressé.

la seule mise en garde avec ce code est qu'il ne supporte pas correctement les widgets GL, donc par exemple la superposition ne peut pas toujours être ajoutée au viewport d'un QGraphicsView. Il peut, cependant, être ajouté à la QGraphicsView lui-même.

2
répondu Mad Physicist 2016-04-14 18:03:41

vous pouvez outrepasser le resizeEvent par

def resizeEvent(self, newSize):
    #do code here
2
répondu chicken-me 2016-12-12 21:31:22