Я хочу выполнить действие, когда виджет был изменен.
Есть ли способ поймать это, не устанавливая фильтр событий для этого виджета (и, очевидно, без его подклассификации)? 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