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.
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
Vous pouvez tirer d' widget
classe et réimplémenter resizeEvent
événement
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_())
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)
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.
vous pouvez outrepasser le resizeEvent
par
def resizeEvent(self, newSize):
#do code here