Я хочу выполнить действие, когда виджет был изменен.
Есть ли способ поймать это, не устанавливая фильтр событий для этого виджета (и, очевидно, без его подклассификации)? AFAIK, QWidget не имеет сигнала resized.
Я хочу выполнить действие, когда виджет был изменен.
Есть ли способ поймать это, не устанавливая фильтр событий для этого виджета (и, очевидно, без его подклассификации)? AFAIK, QWidget не имеет сигнала resized.
Если у вас есть другой QObject, который может иметь строгое отношение к этому QWidget, вы можете использовать QObject::installEventFilter(QObject * filter) и перегружать bool eventFilter(QObject *, QEvent *). Подробнее см. Qt docs
Вы можете получить из класса widget и переопределить resizeEvent событие
Если вы используете Python с PyQt4, вы можете установить widget.resizeEvent в свою функцию без его подсекции:
#!/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_())
Извините, это похоже на взлом, но я использую это:
some_widget.resizeEvent = (lambda old_method: (lambda event: (self._on_resized(event), old_method(event))[-1]))(some_widget.resizeEvent)
Это уже через пару лет, но я работал над прозрачным оверлейным виджэтом, который полностью покрывал бы родителя. Вы не можете делать то, что хотите, без подкласса, но вы можете ограничить подклассу экземпляру, как предлагает @reclosedev, что означает, что вам не нужно создавать подкласс.
Я написал следующий фрагмент (который работает в PyQt4), чтобы следить за размером любого виджета, который добавлен виджет:
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())
Этот код использует пару опрятных трюков, которые возможны с Python:
_original нового. Это возможно, потому что функции являются объектами.QWidget, что означает, что вам не нужно создавать фактический подкласс. Каждый родительский экземпляр будет фактически стать экземпляром подкласса в соответствии с методом привязки.Если вам нужна единовременная вещь, весь код для удаления подкласса resizeEvent и замена его оригиналом может быть поврежден. В этом случае решение в основном является более удобной версией решения @reclosedev, но с комментариями @Chris о сохранении исходного адреса.
Единственное предостережение с этим кодом заключается в том, что он не поддерживает GL-виджеты правильно, поэтому, например, оверлей не всегда можно добавить в окно просмотра QGraphicsView. Его можно, однако, добавить к самому QGraphicsView.
Вы можете переопределить resizeEvent на
def resizeEvent(self, newSize):
#do code here